Question Add-member sur un objet treeview

Plus d'informations
il y a 16 ans 6 mois #5309 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

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

Plus d'informations
il y a 16 ans 6 mois #5310 par Laurent Dardenne
Salut,
crysto444 écrit:

Et j'aimerai savoir s'il est possible d'ajouter un membre (noteproperty)dans un objet de type System.Windows.Forms.TreeView.

Add-Member ne fonctionne que sur un objet de la classe PSObject, un adapteur.
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.

Plus d'informations
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

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

Plus d'informations
il y a 16 ans 6 mois #5324 par Laurent Dardenne
Merci pour le code, je vais regardé ça.
crysto444 écrit:

Seul bémol, je range un objet PSobject dans le champ tag du treeview.

Je ne vois pas comment faire autrement :S

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.

Plus d'informations
il y a 16 ans 6 mois #5325 par Laurent Dardenne
Je te propose une petite modification, au lieu de
[code:1]
$Psobj | Add-Member Noteproperty JType \&quot;server\&quot;
[/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
Propulsé par Kunena