Question Datagridview et Ibindinglist

Plus d'informations
il y a 9 ans 2 mois #18747 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 :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 2 mois #18750 par Laurent Dardenne
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]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 2 mois #18765 par Nicolas Lang
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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 2 mois #18766 par Laurent Dardenne
Darum écrit:

tu ne touches pas aux objets DANS la listbox, mais tu modifies la source de données que tu relie ensuite au contrôle...

Oui, c'est un usage basique pour une démo.
Ensuite, et comme tu l'as fait, il faut creuser le sujet pour aller plus loin.

Darum écrit:

J'ai modifié ton code afin de voir comment réagissait la lstbox à une suppression,

Je met à jour cette démo prochainement.
Darum écrit:

Merci de m'avoir mis sur la voie pour trouver l'origine de ce problème :)

Merci pour ton retour, il servira à d'autres :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.084 secondes
Propulsé par Kunena