Bonjour à tous,
Je n'ai pas énormément d'expérience dans le scripting mais en m’intéressant à PowerShell j'en suis arrivé à vouloir utiliser treeview dans le but de sélectionner des fichiers et répertoires à sauvegarder ensuite avec la commande robocopy.
Sur le web, j'ai pu récupérer des bouts de scripts que j'ai assemblés pour essayer de faire quelque chose qui fonctionne.
Je suis loin de comprendre toutes les lignes et je commence à en avoir un peu marre de tourner en rond, cependant j'aurais aimé le "finir" avant de travailler quelque chose de beaucoup moins costaud pour mon niveau ! Peut-être que vous pourriez m'apporter un peu d'aide.
Donc lorsqu'on coche un nœud parent, les nœuds enfants sont tous cochés (ceci est vrai uniquement lorsque l'arborescence est dépliée) et lorsque tous les nœuds enfants sont cochés, le nœud parent l'est également.
Ce que j'aimerais faire, au clique du bouton "OK", c'est récupérer le nom du dossier parent uniquement, lorsque tous les nœuds enfants sont cochés. Quand tous les nœuds enfants ne sont pas cochés, j'aimerais dans ce cas récupérer ceux qui le sont.
Quand un nœud est décoché, bien sûr dans ce cas je ne souhaiterais pas récupérer son nom.
Pour le moment je ne vois même pas comment récupérer une de ces valeurs et entre autres, je ne comprends pas bien la commande (le terme exact ne semble pas me venir) "AfterCheck".
Voilà donc le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 $nul = "<NULL>" $type = "Directory", "File" function Show-Error([string]$mes) { [Windows.Forms.MessageBox]::Show($mes, "Error", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Exclamation ) } function Add-RootsTree { [IO.Directory]::GetLogicalDrives() | % { $nod = $tvRoots.Nodes.Add($_) $nod.Nodes.Add($nul) } } function Add-Folders { $_.Node.Nodes.Clear() try { foreach ($i in [IO.Directory]::GetDirectories($_.Node.FullPath)) { $node = $_.Node.Nodes.Add([IO.Path]::GetFileName($i)) $node.Tag = $type[0] $node.Nodes.Add($nul) } } catch { Show-Error $_.Exception.Message } } function Add-Files { try { foreach ($i in [IO.Directory]::GetFiles($_.Node.FullPath)) { $node = $_.Node.Nodes.Add([IO.Path]::GetFileName($i)) $node.Tag = $type[1] } } catch {} } $tvRoots_BeforeExpand= { Add-Folders Add-Files } function checkChildNode($node) { $checkStatus = $node.checked foreach ($n in $node.nodes) { $n.checked = $checkstatus checkChildNode($n) } } function checkParentNode($node) { $parent = $node.parent if($parent -eq $null) { return } $parent.checked = $true foreach ($n in $parent.nodes) { if(!$n.checked) { $parent.checked = $false break } } checkparentNode($parent) } function frmMain_Show { Add-Type -AssemblyName System.Windows.Forms [Windows.Forms.Application]::EnableVisualStyles() $ico = [Drawing.Icon]::ExtractAssociatedIcon(($PSHome + '\powershell.exe')) $frmMain = New-Object Windows.Forms.Form $tvRoots = New-Object Windows.Forms.TreeView # #tvRoots # $tvRoots.Dock = "Fill" $tvRoots.CheckBoxes = $true $tvRoots.Add_AfterSelect($tvRoots_AfterSelect) $tvRoots.Add_BeforeExpand($tvRoots_BeforeExpand) $TV_AfterCheck = { $tvRoots.Remove_AfterCheck($TV_AfterCheck) checkChildNode($_.node) checkParentNode($_.node) $tvRoots.Add_AfterCheck($TV_AfterCheck) } $tvRoots.Add_AfterCheck($TV_AfterCheck) $ButtonOK = New-Object System.Windows.Forms.Button $ButtonOK.DialogResult = 'OK' $ButtonOK.Location = New-Object System.Drawing.Point(245,300) $ButtonOK.Size = New-Object System.Drawing.Size(75,23) $ButtonOK.Name = 'ButtonOK' $ButtonOK.Text = 'OK' $ButtonOK.UseVisualStyleBackColor = $True #frmMain # $frmMain.ClientSize = New-Object Drawing.Size(350, 350) $frmMain.Controls.AddRange(@($tvRoots, $sbPanel)) $frmMain.FormBorderStyle = "FixedSingle" $frmMain.Icon = $ico $frmMain.StartPosition = "CenterScreen" $frmMain.Text = "Explorer Style Script" $frmMain.Add_Load({Add-RootsTree}) $frmMain.Controls.Add($ButtonOK) $frmMain.Controls.Add($tvroots) [void]$frmMain.ShowDialog() } frmMain_Show
Partager