Question
Add-member sur un objet treeview
- crystof
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 11
- Remerciements reçus 0
il y a 16 ans 6 mois #5309
par crystof
Add-member sur un objet treeview a été créé par crystof
Bonjour à tous,
Je continu ma découverte de Powershell avec l'instruction add-member.
Et j'aimerai savoir s'il est possible d'ajouter un membre (noteproperty)dans un objet de type System.Windows.Forms.TreeView.
Je m'explique, le treeview (permet de visualiser un \"arbre\" - comme le nom l'indique) et est bien pratique car il classe ses élements sous forme de liste chainée donc facile à parcourir.
La tentation est grande de pouvoir y ajouter des propriétés perso (comme par exemple les propriétés des élements affichés).
Je n'y arrive pas.... mais je suis pas sur d'en avoir compris toutes les subtilités:blink:
Merci d'avance
Je continu ma découverte de Powershell avec l'instruction add-member.
Et j'aimerai savoir s'il est possible d'ajouter un membre (noteproperty)dans un objet de type System.Windows.Forms.TreeView.
Je m'explique, le treeview (permet de visualiser un \"arbre\" - comme le nom l'indique) et est bien pratique car il classe ses élements sous forme de liste chainée donc facile à parcourir.
La tentation est grande de pouvoir y ajouter des propriétés perso (comme par exemple les propriétés des élements affichés).
Je n'y arrive pas.... mais je suis pas sur d'en avoir compris toutes les subtilités:blink:
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 6 mois #5310
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Add-member sur un objet treeview
Salut,
crysto444 écrit:
Si tu veux ajouter des membres à la classe en question tu dois passer par le C# 3.0 et le framework approprié.
Cela doit être possible de faire cela, ensuite dans un eventhandler tu récupères une instance d'un TreeView et pas une instance de PSObject, je n'ai jamais tester si tu peux récupérer le PSObject l'adaptant...
En revanche que ton Treeview manipule des PSObject ça doit être possible.
As-tu un exemple à nous proposer ?
crysto444 écrit:
Add-Member ne fonctionne que sur un objet de la classe PSObject, un adapteur.Et j'aimerai savoir s'il est possible d'ajouter un membre (noteproperty)dans un objet de type System.Windows.Forms.TreeView.
Si tu veux ajouter des membres à la classe en question tu dois passer par le C# 3.0 et le framework approprié.
Cela doit être possible de faire cela, ensuite dans un eventhandler tu récupères une instance d'un TreeView et pas une instance de PSObject, je n'ai jamais tester si tu peux récupérer le PSObject l'adaptant...
En revanche que ton Treeview manipule des PSObject ça doit être possible.
As-tu un exemple à nous proposer ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- crystof
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 11
- Remerciements reçus 0
il y a 16 ans 6 mois #5323
par crystof
Réponse de crystof sur le sujet Re:Add-member sur un objet treeview
Encore une fois merci.
Sur tes conseils, j'ai bati un proto qui en plus a l'air de fonctionner (c'est bien la premiere fois
)
Seul bémol, je range un objet PSobject dans le champ tag du treeview.
Bonne fin de journée à tous.
Ps: j'ai ajouté des blancs entre : et S + X pour eviter les smileys ci-dessous
[code:1]
#Prototype test add-member/psobject in a treeview
# Creation d'un arbre en fonction du fichier powertools.xml
# le xml est découpé en \"group\" et sous chaque groupe des serveurs avec des propritétés
# les propriétés sont entrées dans un objet Psobject avec l'instruction add-member
# l'objet Psobjet complété des caraterisques est entré dans l'élement Tag du treeview...
# A la sélection d'un groupe ou d'un serveur (par double-click), les s-élements de type \"server\"
# sont listés.
[reflection.assembly]::loadwithpartialname(\"System.Drawing\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Windows.Forms\"«») | Out-Null
Set-PSDebug -strict
$debugPreference=\"Continue\"
# Global
$global: ServersList=@()
$global:root=$null
#================= Scan tree node for a selected group and return teh server list belonging to this group
function ScanNodesforservers ([object]$Next)
{
$listserv=$null
foreach ($el in $Next) {
Write-debug \"ScanNodesforservers: $($el.name);$($el.tag.Jtype);$($el.tag.Jparam);$($el.tag.Jcreds);\"
if( $el.tag.Jtype -eq \"server\" ){
# found a server
$listserv+=@($el.name)
}
$TmP=ScanNodesforservers $el.nodes
$listserv+=@($TmP)
}
return $listserv
}
#================= load information from xml file and display tree
function ScanXmlTree( [object]$Upper, $parent ){
$Upper.Reboot | ForEach-Object {
if( $_ -ne $null ){
Write-debug \"ScanXmlTree: Creating tree node for $($_.group)\"
$node = New-Object System.Windows.Forms.TreeNode
$node.Text=$_.group
$node.name=$_.group
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"group\"
Write-Debug \"ScanXmlTree: Jtype=$($Psobj.JType) for $($node.Text)\"
$node.tag = $Psobj
$parent.Nodes.Add($node)
$Sobj=$_
ScanXmlTree $Sobj $node
$Sobj.Server | ForEach-Object {
if( $_ -ne $null ){
Write-debug \"ScanXmlTree: Adding $($_.name ) to $($Sobj.group)\"
$snode = New-Object System.Windows.Forms.TreeNode
$snode.Text=$_.name + \" (\" + $_.cmt + \"«»)\"
$snode.name=$_.name
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"server\"
$Psobj | Add-Member Noteproperty JParam $_.params
$Psobj | Add-Member Noteproperty JCreds $_.credential
Write-Debug \"ScanXmlTree: Jtype=$($Psobj.JType) for $($snode.Text)\"
$snode.tag = $Psobj
$snode.ForeColor='green'
$node.nodes.add($snode) | Out-Null
}
}
}
}
}
#
# Events Scripts :
#
Boutton Quit
$Handler_Quit=
{
$form1.Close()
}
#
Selection in treeview
$handler_Select_In_Treeview=
{
$global: ServersList=ScanNodesforservers $this.SelectedNode
Write-Debug \"handler_Select_In_Treeview: liste=$($ServersList)\"
}
#
Selection of an item in treeview
$handler_LoadForm={
$global: XmlObj = [xml](Get-Content \"powertools.xml\"«»)
$global:root = New-Object System.Windows.Forms.TreeNode
$global:root.text = \"powertools.xml\"
$global:root.Name = \"powertools.xml\"
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"group\"
Write-Debug \"handler_LoadForm: $($Psobj.JType)\"
$global:root.tag = $Psobj
$XmlTree.Nodes.Add($root)|Out-Null
ScanXmlTree $XmlObj.TheJReboot $root
}
#
# Form
$form1 = New-Object System.Windows.Forms.Form
$btnQuit = New-Object System.Windows.Forms.Button
$XmlTree = New-Object System.Windows.Forms.TreeView
#Form1
$form1.Text = 'Prototype test add-member/psobject/treeview'
$form1.Name = 'form1'
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.ForeColor = [System.Drawing.Color]::FromArgb(255,0,78,152)
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 377
$System_Drawing_Size.Height = 304
$form1.ClientSize = $System_Drawing_Size
$form1.add_Load($handler_LoadForm)
#btnQuit
$btnQuit.TabIndex = 6
$btnQuit.BackColor = [System.Drawing.Color]::FromArgb(255,212,208,200)
$btnQuit.Name = 'btnQuit'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$btnQuit.Size = $System_Drawing_Size
$btnQuit.UseVisualStyleBackColor = $False
$btnQuit.Text = 'Quit'
$btnQuit.ForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 292
$System_Drawing_Point.Y = 245
$btnQuit.Location = $System_Drawing_Point
$btnQuit.DataBindings.DefaultDataSourceUpdateMode = 0
$btnQuit.add_Click($Handler_Quit)
$form1.Controls.Add($btnQuit)
#XmlTree
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 273
$System_Drawing_Size.Height = 256
$XmlTree.Size = $System_Drawing_Size
$XmlTree.Name = 'XmlTree'
$XmlTree.BorderStyle = 1
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 12
$XmlTree.Location = $System_Drawing_Point
$XmlTree.DataBindings.DefaultDataSourceUpdateMode = 0
$XmlTree.TabIndex = 0
$XmlTree.add_DoubleClick($handler_Select_In_Treeview)
$form1.Controls.Add($XmlTree)
# Show the Form
$form1.ShowDialog()| Out-Null
[/code:1]
et un xml de test :
[code:1]<TheJReboot>
<Credentials>
<user name=\"ibxxx\Admin@xxx\" />
</Credentials>
<Reboot group=\"pfax\">
<Reboot group=\"pfax1\">
<Server name=\"totofax1\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\"/>
<Server name=\"titifax1\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\"/>
</Reboot>
<Reboot group=\"pfax2\">
<Server name=\"totofax2\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\"/>
<Server name=\"titifax2\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\" />
</Reboot>
<Server name=\"totofax\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\" />
</Reboot>
<Reboot group=\"pfix\">
<Server name=\"totofix\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\" />
<Server name=\"titifix\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\" />
</Reboot>
</TheJReboot>[/code:1]
Message édité par: crysto444, à: 18/09/09 14:56<br><br>Message édité par: crysto444, à: 18/09/09 17:08
Sur tes conseils, j'ai bati un proto qui en plus a l'air de fonctionner (c'est bien la premiere fois
Seul bémol, je range un objet PSobject dans le champ tag du treeview.
Bonne fin de journée à tous.
Ps: j'ai ajouté des blancs entre : et S + X pour eviter les smileys ci-dessous
[code:1]
#Prototype test add-member/psobject in a treeview
# Creation d'un arbre en fonction du fichier powertools.xml
# le xml est découpé en \"group\" et sous chaque groupe des serveurs avec des propritétés
# les propriétés sont entrées dans un objet Psobject avec l'instruction add-member
# l'objet Psobjet complété des caraterisques est entré dans l'élement Tag du treeview...
# A la sélection d'un groupe ou d'un serveur (par double-click), les s-élements de type \"server\"
# sont listés.
[reflection.assembly]::loadwithpartialname(\"System.Drawing\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Windows.Forms\"«») | Out-Null
Set-PSDebug -strict
$debugPreference=\"Continue\"
# Global
$global: ServersList=@()
$global:root=$null
#================= Scan tree node for a selected group and return teh server list belonging to this group
function ScanNodesforservers ([object]$Next)
{
$listserv=$null
foreach ($el in $Next) {
Write-debug \"ScanNodesforservers: $($el.name);$($el.tag.Jtype);$($el.tag.Jparam);$($el.tag.Jcreds);\"
if( $el.tag.Jtype -eq \"server\" ){
# found a server
$listserv+=@($el.name)
}
$TmP=ScanNodesforservers $el.nodes
$listserv+=@($TmP)
}
return $listserv
}
#================= load information from xml file and display tree
function ScanXmlTree( [object]$Upper, $parent ){
$Upper.Reboot | ForEach-Object {
if( $_ -ne $null ){
Write-debug \"ScanXmlTree: Creating tree node for $($_.group)\"
$node = New-Object System.Windows.Forms.TreeNode
$node.Text=$_.group
$node.name=$_.group
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"group\"
Write-Debug \"ScanXmlTree: Jtype=$($Psobj.JType) for $($node.Text)\"
$node.tag = $Psobj
$parent.Nodes.Add($node)
$Sobj=$_
ScanXmlTree $Sobj $node
$Sobj.Server | ForEach-Object {
if( $_ -ne $null ){
Write-debug \"ScanXmlTree: Adding $($_.name ) to $($Sobj.group)\"
$snode = New-Object System.Windows.Forms.TreeNode
$snode.Text=$_.name + \" (\" + $_.cmt + \"«»)\"
$snode.name=$_.name
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"server\"
$Psobj | Add-Member Noteproperty JParam $_.params
$Psobj | Add-Member Noteproperty JCreds $_.credential
Write-Debug \"ScanXmlTree: Jtype=$($Psobj.JType) for $($snode.Text)\"
$snode.tag = $Psobj
$snode.ForeColor='green'
$node.nodes.add($snode) | Out-Null
}
}
}
}
}
#
# Events Scripts :
#
Boutton Quit
$Handler_Quit=
{
$form1.Close()
}
#
Selection in treeview
$handler_Select_In_Treeview=
{
$global: ServersList=ScanNodesforservers $this.SelectedNode
Write-Debug \"handler_Select_In_Treeview: liste=$($ServersList)\"
}
#
Selection of an item in treeview
$handler_LoadForm={
$global: XmlObj = [xml](Get-Content \"powertools.xml\"«»)
$global:root = New-Object System.Windows.Forms.TreeNode
$global:root.text = \"powertools.xml\"
$global:root.Name = \"powertools.xml\"
$Psobj=New-Object PSobject
$Psobj | Add-Member Noteproperty JType \"group\"
Write-Debug \"handler_LoadForm: $($Psobj.JType)\"
$global:root.tag = $Psobj
$XmlTree.Nodes.Add($root)|Out-Null
ScanXmlTree $XmlObj.TheJReboot $root
}
#
# Form
$form1 = New-Object System.Windows.Forms.Form
$btnQuit = New-Object System.Windows.Forms.Button
$XmlTree = New-Object System.Windows.Forms.TreeView
#Form1
$form1.Text = 'Prototype test add-member/psobject/treeview'
$form1.Name = 'form1'
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.ForeColor = [System.Drawing.Color]::FromArgb(255,0,78,152)
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 377
$System_Drawing_Size.Height = 304
$form1.ClientSize = $System_Drawing_Size
$form1.add_Load($handler_LoadForm)
#btnQuit
$btnQuit.TabIndex = 6
$btnQuit.BackColor = [System.Drawing.Color]::FromArgb(255,212,208,200)
$btnQuit.Name = 'btnQuit'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$btnQuit.Size = $System_Drawing_Size
$btnQuit.UseVisualStyleBackColor = $False
$btnQuit.Text = 'Quit'
$btnQuit.ForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 292
$System_Drawing_Point.Y = 245
$btnQuit.Location = $System_Drawing_Point
$btnQuit.DataBindings.DefaultDataSourceUpdateMode = 0
$btnQuit.add_Click($Handler_Quit)
$form1.Controls.Add($btnQuit)
#XmlTree
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 273
$System_Drawing_Size.Height = 256
$XmlTree.Size = $System_Drawing_Size
$XmlTree.Name = 'XmlTree'
$XmlTree.BorderStyle = 1
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 12
$XmlTree.Location = $System_Drawing_Point
$XmlTree.DataBindings.DefaultDataSourceUpdateMode = 0
$XmlTree.TabIndex = 0
$XmlTree.add_DoubleClick($handler_Select_In_Treeview)
$form1.Controls.Add($XmlTree)
# Show the Form
$form1.ShowDialog()| Out-Null
[/code:1]
et un xml de test :
[code:1]<TheJReboot>
<Credentials>
<user name=\"ibxxx\Admin@xxx\" />
</Credentials>
<Reboot group=\"pfax\">
<Reboot group=\"pfax1\">
<Server name=\"totofax1\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\"/>
<Server name=\"titifax1\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\"/>
</Reboot>
<Reboot group=\"pfax2\">
<Server name=\"totofax2\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\"/>
<Server name=\"titifax2\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\" />
</Reboot>
<Server name=\"totofax\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\" />
</Reboot>
<Reboot group=\"pfix\">
<Server name=\"totofix\" cmt=\"MOE\" params=\"waitbeforeboot=0;waitafterboot=10;\" credential=\"ibxxx\Admin\" />
<Server name=\"titifix\" cmt=\"MOA\" params=\"waitbeforeboot=10;waitafterboot=10;previous=on;\" credential=\"ibxxx\Admin\" />
</Reboot>
</TheJReboot>[/code:1]
Message édité par: crysto444, à: 18/09/09 14:56<br><br>Message édité par: crysto444, à: 18/09/09 17:08
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 6 mois #5324
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Add-member sur un objet treeview
Merci pour le code, je vais regardé ça.
crysto444 écrit:
Sinon j'ai regardé pour accéder à l'adapteur dans un gestionnaire d'événement.
A moins d'y manipuler tjrs le même nom de variable, il n'est pas possible d'y manipuler la variable $this comme un PSObject.
[code:1]
$btnClose=$btnClose|add-member NoteProperty Test 10 –passthru
function OnClick_btnClose{
$btnClose.Test
$this.Test
$Form1.Close()
}
$btnClose.Add_Click( { OnClick_btnClose } )
[/code:1]
Comme on peut partager un gestionnaire d'événement entre + composants, la première approche ne fonctionne plus. On peut utiliser le champs tag pour y placer une référence à l'adapteur :
[code:1]
#On utilise une référence
$btnClose.tag=[ref]$btnclose
$btnTruc=$btnTruc|add-member NoteProperty Test 75 –passthru
function OnClick_btnClose{
#PSObject de this
$this.Tag.Value.Test
$this.Name
$Form1.Close()
}
$btnTruc.Add_Click( { OnClick_btnClose } )
[/code:1]
Les instructions suivantes affectent l'object sous-jacent et pas le psobject :
[code:1]
$btnClose.tag=$btnclose
$btnClose.tag=$btnclose -as [Psobject]
[/code:1]
C'est un peu tordu, mais de connaître l'astuce peut servir dans certains cas.
crysto444 écrit:
Je ne vois pas comment faire autrementSeul bémol, je range un objet PSobject dans le champ tag du treeview.
Sinon j'ai regardé pour accéder à l'adapteur dans un gestionnaire d'événement.
A moins d'y manipuler tjrs le même nom de variable, il n'est pas possible d'y manipuler la variable $this comme un PSObject.
[code:1]
$btnClose=$btnClose|add-member NoteProperty Test 10 –passthru
function OnClick_btnClose{
$btnClose.Test
$this.Test
$Form1.Close()
}
$btnClose.Add_Click( { OnClick_btnClose } )
[/code:1]
Comme on peut partager un gestionnaire d'événement entre + composants, la première approche ne fonctionne plus. On peut utiliser le champs tag pour y placer une référence à l'adapteur :
[code:1]
#On utilise une référence
$btnClose.tag=[ref]$btnclose
$btnTruc=$btnTruc|add-member NoteProperty Test 75 –passthru
function OnClick_btnClose{
#PSObject de this
$this.Tag.Value.Test
$this.Name
$Form1.Close()
}
$btnTruc.Add_Click( { OnClick_btnClose } )
[/code:1]
Les instructions suivantes affectent l'object sous-jacent et pas le psobject :
[code:1]
$btnClose.tag=$btnclose
$btnClose.tag=$btnclose -as [Psobject]
[/code:1]
C'est un peu tordu, mais de connaître l'astuce peut servir dans certains cas.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 6 mois #5325
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Add-member sur un objet treeview
Je te propose une petite modification, au lieu de
[code:1]
$Psobj | Add-Member Noteproperty JType \"server\"
[/code:1]
tu peux faire :
[code:1]
$Psobj.PSObject.TypeNames.Insert(0,'Server')
[/code:1]
et pour
[code:1]
$Psobj.JType
[/code:1]
faire
[code:1]
$Psobj.PSObject.TypeNames[0]
[/code:1]
C'est un peu plus verbeux, mais autant utiliser les infos existantes concernant le type.
Ainsi au fur et à mesure de la construction d'objet de type personnalisé nul besoin de connaitre la propriété nommant le type.
[code:1]
$Psobj | Add-Member Noteproperty JType \"server\"
[/code:1]
tu peux faire :
[code:1]
$Psobj.PSObject.TypeNames.Insert(0,'Server')
[/code:1]
et pour
[code:1]
$Psobj.JType
[/code:1]
faire
[code:1]
$Psobj.PSObject.TypeNames[0]
[/code:1]
C'est un peu plus verbeux, mais autant utiliser les infos existantes concernant le type.
Ainsi au fur et à mesure de la construction d'objet de type personnalisé nul besoin de connaitre la propriété nommant le type.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.057 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Add-member sur un objet treeview