Question Datagridview et Ibindinglist
- Nicolas Lang
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 31
- Remerciements reçus 0
il y a 9 ans 8 mois #18747
par Nicolas Lang
Datagridview et Ibindinglist a été créé par Nicolas Lang
Bonjour à vous! Et meilleurs voeux tant qu'on y'est!
Santé, bonheur, package habituel quoi...
Je suis en train de créer un forms qui va recueillir des données issues de l'AD dans un datagridview. En fonction d'un choix, je dois pouvoir supprimer des elements de la liste du Datagridview. L'affichage des données se fait sans problème (j'ai un pscustomobject en datasource) mais par contre, lorsque je fais une suppression
[code:1]
$dataGridView1.Rows.RemoveAt($dataGridView1.CurrentRow.Index)
[/code:1]
j'ai un message d'erreur.
[code:1]
«Impossible de supprimer des lignes par programmation
si le DataGridView n'est pas lié à un IBindingList qui prend en charge la notification de modifications et autorise
la suppression.»
[/code:1]
Impossible de trouver une documentation qui me permette de créer cette IBindinglist, comment la peupler depuis powershell (puisque visiblement ce que je mets en Datasource ne convient pas pour le tri et la suppression)...
Et quand je vais voir la doc du Technet sur IBindinglist, j'essaie de recréer un objet ainsi :
[code:1] $liste = [System.ComponentModel.IBindingList][/code:1]
Je n'ai aucune des méthodes fournies avec l'objet (qui est de type System.Runtimetype) ...
Et si je fais :
[code:1]$liste = new-object System.ComponentModel.IBindingList
[/code:1]
J'ai l'erreur :
[code:1]Constructeur introuvable. Impossible de trouver un constructeur approprié pour le type
System.ComponentModel.IBindingList.[/code:1]
Quelqu'un a déja eu à faire avec ces listes et saurait m'expliquer la façon de faire?
En vous remerciant d'avance
Santé, bonheur, package habituel quoi...
Je suis en train de créer un forms qui va recueillir des données issues de l'AD dans un datagridview. En fonction d'un choix, je dois pouvoir supprimer des elements de la liste du Datagridview. L'affichage des données se fait sans problème (j'ai un pscustomobject en datasource) mais par contre, lorsque je fais une suppression
[code:1]
$dataGridView1.Rows.RemoveAt($dataGridView1.CurrentRow.Index)
[/code:1]
j'ai un message d'erreur.
[code:1]
«Impossible de supprimer des lignes par programmation
si le DataGridView n'est pas lié à un IBindingList qui prend en charge la notification de modifications et autorise
la suppression.»
[/code:1]
Impossible de trouver une documentation qui me permette de créer cette IBindinglist, comment la peupler depuis powershell (puisque visiblement ce que je mets en Datasource ne convient pas pour le tri et la suppression)...
Et quand je vais voir la doc du Technet sur IBindinglist, j'essaie de recréer un objet ainsi :
[code:1] $liste = [System.ComponentModel.IBindingList][/code:1]
Je n'ai aucune des méthodes fournies avec l'objet (qui est de type System.Runtimetype) ...
Et si je fais :
[code:1]$liste = new-object System.ComponentModel.IBindingList
[/code:1]
J'ai l'erreur :
[code:1]Constructeur introuvable. Impossible de trouver un constructeur approprié pour le type
System.ComponentModel.IBindingList.[/code:1]
Quelqu'un a déja eu à faire avec ces listes et saurait m'expliquer la façon de faire?
En vous remerciant d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 8 mois #18750
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Datagridview et Ibindinglist
Quel est le type de ta source ?
Consulte ceci au cas où, a priori le pb viens du databinding
Enfin pour le type [System.ComponentModel.IBindingList], la convention fait que les interfaces débute par 'I', Powershell ne gère pas les interfaces, à moins bricoler via un module.
Une démo du principe (sans la suppression) :
[code:1]
################################################################################
#
# Nom : TestDataBinding.ps1
# Version : 1.2.1
# Date : 1 août 2010
#
################################################################################
#Création du tableau d'objet
$ArrayList= new-object System.Collections.ArrayList
$Global:Number=0
function CreateItem {
$Global:Number++
$Item = new-object PSObject
#Affichage des infos
$Item=$Item | Add-Member -membertype Noteproperty `
-name Name `
-value \"Nom$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name Description `
-value \"description$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name IP_Address `
-value \"IPAddresse$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name Passerelle `
-value \"GW$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name DNS_Prim `
-value \"DNS1-$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name DNS_Sec `
-value \"DNS2-$Number\" -pass
#etc
[void]$ArrayList.Add($Item)
}
1..5|% {CreateItem}
# Chargement des assemblies externes
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)
$pnlHaut = new-object System.Windows.Forms.Panel
$pnlBas = new-object System.Windows.Forms.Panel
$BtnClose = new-object System.Windows.Forms.Button
$BtnAddItem = new-object System.Windows.Forms.Button
$lstBoxObjects = new-object System.Windows.Forms.ListBox
#
# pnlHaut
#
$pnlHaut.Controls.Add($lstBoxObjects)
$pnlHaut.Dock =[System.Windows.Forms.DockStyle]::Fill
$pnlHaut.Location = new-object System.Drawing.Point(0, 0)
$pnlHaut.Name = \"pnlHaut\"
$pnlHaut.Size = new-object System.Drawing.Size(566, 329)
$pnlHaut.TabIndex = 0
#
# pnlBas
#
$pnlBas.Controls.Add($BtnAddItem)
$pnlBas.Controls.Add($BtnClose)
$pnlBas.Dock =[System.Windows.Forms.DockStyle]::Bottom
$pnlBas.Location = new-object System.Drawing.Point(0, 265)
$pnlBas.Name = \"pnlBas\"
$pnlBas.Size = new-object System.Drawing.Size(566, 64)
$pnlBas.TabIndex = 1
#
# BtnClose
#
$BtnClose.Location = new-object System.Drawing.Point(464, 29)
$BtnClose.Name = \"BtnClose\"
$BtnClose.Size = new-object System.Drawing.Size(75, 23)
$BtnClose.TabIndex = 0
$BtnClose.Text = \"Close\"
$BtnClose.UseVisualStyleBackColor = $true
function OnClick_BtnClose{
$Form1.Close()
}
$BtnClose.Add_Click( { OnClick_BtnClose } )
#
# BtnAddItem
#
$BtnAddItem.Location = new-object System.Drawing.Point(334, 29)
$BtnAddItem.Name = \"BtnAddItem\"
$BtnAddItem.Size = new-object System.Drawing.Size(83, 23)
$BtnAddItem.TabIndex = 1
$BtnAddItem.Text = \"Add item\"
$BtnAddItem.UseVisualStyleBackColor = $true
function OnClick_BtnAddItem{
CreateItem
#If you are bound to a data source that does not implement the IBindingList interface, such as an ArrayList,
#the bound control's data will not be updated when the data source is updated.
# la suite : msdn.microsoft.com/en-us/library/w67sdsex.aspx
$lstBoxObjects.DataSource = $Null
$lstBoxObjects.DataSource = $ArrayList
$lstBoxObjects.DisplayMember = \"Name\";
#$lstBoxObjects.Refresh()
}
$BtnAddItem.Add_Click( { OnClick_BtnAddItem } )
#
# lstBoxObjects
#
$lstBoxObjects.Dock =[System.Windows.Forms.DockStyle]::Fill
$lstBoxObjects.FormattingEnabled = $true
$lstBoxObjects.Location = new-object System.Drawing.Point(0, 0)
$lstBoxObjects.Name = \"lstBoxObjects\"
$lstBoxObjects.Size = new-object System.Drawing.Size(566, 329)
$lstBoxObjects.TabIndex = 0
# --BINDING --
#On lie la listbox avec le tableau $Arraylist
$lstBoxObjects.DataSource = $ArrayList
#On visualise la propriété Name
$lstBoxObjects.DisplayMember = \"Name\";
#
$Form1 = new-object System.Windows.Forms.form
#
$Form1.ClientSize = new-object System.Drawing.Size(566, 329)
$Form1.Controls.Add($pnlBas)
$Form1.Controls.Add($pnlHaut)
$Form1.Name = \"Form1\"
$Form1.Text = \"Test DataBinding\"
function OnFormClosing_Form1{
# $this est égal au paramètre sender (object)
# $_ est égal au paramètre e (eventarg)
# Déterminer la raison de la fermeture :
# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)
#Autorise la fermeture
($_).Cancel= $False
}
$Form1.Add_FormClosing( { OnFormClosing_Form1 } )
$Form1.Add_Shown({$Form1.Activate()})
$Form1.ShowDialog()
#Libération des ressources
$Form1.Dispose()
Write-Host \"Liste d'item :\"
$ArrayList|ft
[/code:1]
Consulte ceci au cas où, a priori le pb viens du databinding
Enfin pour le type [System.ComponentModel.IBindingList], la convention fait que les interfaces débute par 'I', Powershell ne gère pas les interfaces, à moins bricoler via un module.
Une démo du principe (sans la suppression) :
[code:1]
################################################################################
#
# Nom : TestDataBinding.ps1
# Version : 1.2.1
# Date : 1 août 2010
#
################################################################################
#Création du tableau d'objet
$ArrayList= new-object System.Collections.ArrayList
$Global:Number=0
function CreateItem {
$Global:Number++
$Item = new-object PSObject
#Affichage des infos
$Item=$Item | Add-Member -membertype Noteproperty `
-name Name `
-value \"Nom$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name Description `
-value \"description$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name IP_Address `
-value \"IPAddresse$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name Passerelle `
-value \"GW$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name DNS_Prim `
-value \"DNS1-$Number\" -pass|`
Add-Member -membertype Noteproperty `
-name DNS_Sec `
-value \"DNS2-$Number\" -pass
#etc
[void]$ArrayList.Add($Item)
}
1..5|% {CreateItem}
# Chargement des assemblies externes
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)
$pnlHaut = new-object System.Windows.Forms.Panel
$pnlBas = new-object System.Windows.Forms.Panel
$BtnClose = new-object System.Windows.Forms.Button
$BtnAddItem = new-object System.Windows.Forms.Button
$lstBoxObjects = new-object System.Windows.Forms.ListBox
#
# pnlHaut
#
$pnlHaut.Controls.Add($lstBoxObjects)
$pnlHaut.Dock =[System.Windows.Forms.DockStyle]::Fill
$pnlHaut.Location = new-object System.Drawing.Point(0, 0)
$pnlHaut.Name = \"pnlHaut\"
$pnlHaut.Size = new-object System.Drawing.Size(566, 329)
$pnlHaut.TabIndex = 0
#
# pnlBas
#
$pnlBas.Controls.Add($BtnAddItem)
$pnlBas.Controls.Add($BtnClose)
$pnlBas.Dock =[System.Windows.Forms.DockStyle]::Bottom
$pnlBas.Location = new-object System.Drawing.Point(0, 265)
$pnlBas.Name = \"pnlBas\"
$pnlBas.Size = new-object System.Drawing.Size(566, 64)
$pnlBas.TabIndex = 1
#
# BtnClose
#
$BtnClose.Location = new-object System.Drawing.Point(464, 29)
$BtnClose.Name = \"BtnClose\"
$BtnClose.Size = new-object System.Drawing.Size(75, 23)
$BtnClose.TabIndex = 0
$BtnClose.Text = \"Close\"
$BtnClose.UseVisualStyleBackColor = $true
function OnClick_BtnClose{
$Form1.Close()
}
$BtnClose.Add_Click( { OnClick_BtnClose } )
#
# BtnAddItem
#
$BtnAddItem.Location = new-object System.Drawing.Point(334, 29)
$BtnAddItem.Name = \"BtnAddItem\"
$BtnAddItem.Size = new-object System.Drawing.Size(83, 23)
$BtnAddItem.TabIndex = 1
$BtnAddItem.Text = \"Add item\"
$BtnAddItem.UseVisualStyleBackColor = $true
function OnClick_BtnAddItem{
CreateItem
#If you are bound to a data source that does not implement the IBindingList interface, such as an ArrayList,
#the bound control's data will not be updated when the data source is updated.
# la suite : msdn.microsoft.com/en-us/library/w67sdsex.aspx
$lstBoxObjects.DataSource = $Null
$lstBoxObjects.DataSource = $ArrayList
$lstBoxObjects.DisplayMember = \"Name\";
#$lstBoxObjects.Refresh()
}
$BtnAddItem.Add_Click( { OnClick_BtnAddItem } )
#
# lstBoxObjects
#
$lstBoxObjects.Dock =[System.Windows.Forms.DockStyle]::Fill
$lstBoxObjects.FormattingEnabled = $true
$lstBoxObjects.Location = new-object System.Drawing.Point(0, 0)
$lstBoxObjects.Name = \"lstBoxObjects\"
$lstBoxObjects.Size = new-object System.Drawing.Size(566, 329)
$lstBoxObjects.TabIndex = 0
# --BINDING --
#On lie la listbox avec le tableau $Arraylist
$lstBoxObjects.DataSource = $ArrayList
#On visualise la propriété Name
$lstBoxObjects.DisplayMember = \"Name\";
#
$Form1 = new-object System.Windows.Forms.form
#
$Form1.ClientSize = new-object System.Drawing.Size(566, 329)
$Form1.Controls.Add($pnlBas)
$Form1.Controls.Add($pnlHaut)
$Form1.Name = \"Form1\"
$Form1.Text = \"Test DataBinding\"
function OnFormClosing_Form1{
# $this est égal au paramètre sender (object)
# $_ est égal au paramètre e (eventarg)
# Déterminer la raison de la fermeture :
# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)
#Autorise la fermeture
($_).Cancel= $False
}
$Form1.Add_FormClosing( { OnFormClosing_Form1 } )
$Form1.Add_Shown({$Form1.Activate()})
$Form1.ShowDialog()
#Libération des ressources
$Form1.Dispose()
Write-Host \"Liste d'item :\"
$ArrayList|ft
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Nicolas Lang
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 31
- Remerciements reçus 0
il y a 9 ans 8 mois #18765
par Nicolas Lang
Réponse de Nicolas Lang sur le sujet Re:Datagridview et Ibindinglist
Merci pour ta réponse Laurent
Mon objet est une Arraylist, comme dans ton exemple, mais je vois qu'en fait dans ton script, tu ne touches pas aux objets DANS la listbox, mais tu modifies la source de données que tu relie ensuite au contrôle...
J'ai modifié ton code afin de voir comment réagissait la lstbox à une suppression,
[code:1]
$lstbox.items.removeat($lstbox.selectedindex)
[/code:1]
et il agit plus ou moins pareil : il refuse car une source de donnée est liée.
Par contre, je viens de trouver COMMENT faire par le biais du hasard et des essais!
Il ne faut pas manipuler les objets, mais bien la DATASOURCE!
Car la datasource définit les objets affichés, sans réciprocité, et la datasource à les mêmes méthodes (Add(),Remove(),REmoveAt(), etc) que les items !
En essayant de supprimer ainsi :
[code:1]
$lstbox.datasource.removeat($lstbox.selectedindex)
[/code:1]
Il m'a bien supprimé la ligne!
Merci de m'avoir mis sur la voie pour trouver l'origine de ce problème <br><br>Message édité par: Darum, à: 8/01/15 11:30
Mon objet est une Arraylist, comme dans ton exemple, mais je vois qu'en fait dans ton script, tu ne touches pas aux objets DANS la listbox, mais tu modifies la source de données que tu relie ensuite au contrôle...
J'ai modifié ton code afin de voir comment réagissait la lstbox à une suppression,
[code:1]
$lstbox.items.removeat($lstbox.selectedindex)
[/code:1]
et il agit plus ou moins pareil : il refuse car une source de donnée est liée.
Par contre, je viens de trouver COMMENT faire par le biais du hasard et des essais!
Il ne faut pas manipuler les objets, mais bien la DATASOURCE!
Car la datasource définit les objets affichés, sans réciprocité, et la datasource à les mêmes méthodes (Add(),Remove(),REmoveAt(), etc) que les items !
En essayant de supprimer ainsi :
[code:1]
$lstbox.datasource.removeat($lstbox.selectedindex)
[/code:1]
Il m'a bien supprimé la ligne!
Merci de m'avoir mis sur la voie pour trouver l'origine de ce problème <br><br>Message édité par: Darum, à: 8/01/15 11:30
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 8 mois #18766
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Datagridview et Ibindinglist
Darum écrit:
Ensuite, et comme tu l'as fait, il faut creuser le sujet pour aller plus loin.
Darum écrit:
Darum écrit:
Oui, c'est un usage basique pour une démo.tu ne touches pas aux objets DANS la listbox, mais tu modifies la source de données que tu relie ensuite au contrôle...
Ensuite, et comme tu l'as fait, il faut creuser le sujet pour aller plus loin.
Darum écrit:
Je met à jour cette démo prochainement.J'ai modifié ton code afin de voir comment réagissait la lstbox à une suppression,
Darum écrit:
Merci pour ton retour, il servira à d'autresMerci de m'avoir mis sur la voie pour trouver l'origine de ce problème
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.112 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Datagridview et Ibindinglist