Checkbox Event
Hallo zusammen,
benötige mal wieder Eure Unterstützung.
Über "value.Add_CheckStateChanged" bekomme ich beim Auswählen einer beliebigen Checkbox immer nur den Namen der letzten erzeugten Variable zurück und nicht den der ausgewählten Checkbox.
Genauso werden über den Button "Check all" auch nur die jeweils letzten erzeugten Variblen ausgewählt.
Habe schon alles Mögliche ausprobiert, und kommen nicht weiter.
Schon mal vielen Dank.
Schöne Grüße
Markus2016
benötige mal wieder Eure Unterstützung.
Über "value.Add_CheckStateChanged" bekomme ich beim Auswählen einer beliebigen Checkbox immer nur den Namen der letzten erzeugten Variable zurück und nicht den der ausgewählten Checkbox.
Genauso werden über den Button "Check all" auch nur die jeweils letzten erzeugten Variblen ausgewählt.
Habe schon alles Mögliche ausprobiert, und kommen nicht weiter.
Schon mal vielen Dank.
Schöne Grüße
Markus2016
Function GenerateForm {
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.Button")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.Checkbox")
# Input -----------------------------------------------------------------------------#
$Verzeichnis = "C:\Windows_Home\Windows 10\Programme"
$Name = @(ForEach ($file in Get-ChildItem -include *.vbs -Path "$Verzeichnis" -Recurse) { (Get-Content $file) | ForEach-Object {$_.Trim("' ")} })
$Programme_I = $Name | ForEach-Object {$_} | Sort-Object | Select-Object -First 20
$Programme_II = $Name | ForEach-Object {$_} | Sort-Object | Select-Object -Skip 20 -First 20
$Programme_III = $Name | ForEach-Object {$_} | Sort-Object | Select-Object -Skip 40 -First 20
# Input Ende ------------------------------------------------------------------------#
# Window ----------------------------------------------------------------------------#
$Window = New-Object System.Windows.Forms.Form
$Window.StartPosition = "CenterScreen"
$Window.Size = New-Object System.Drawing.Size(800,600)
$Window.Font = "Eras ITC, 8"
$Window.Text = "Windows Setup - Programme auswählen und kopieren..."
$Window.BackColor = "white"
$Window.Topmost = $true
$Window.ShowInTaskbar=$false
$Window.MaximizeBox = $false
$Window.MinimizeBox = $false
$Window.ControlBox = $true
$Window.Name = "Window"
$i = 0
ForEach ($_ in $Programme_I ) {
$Variable_I = $Programme_I[$i]
New-Variable -Name $Variable_I -Value (New-Object System.Windows.Forms.CheckBox) -Force
$Window.Controls.Add((Get-Variable $Variable_I).Value)
(Get-Variable $Variable_I).value.Text = $_
$i++
$Y = $i * 20
(Get-Variable $Variable_I).value.Location = New-Object System.Drawing.Size(60, $Y)
(Get-Variable $Variable_I).value.Size = New-Object System.Drawing.Size(240, 20)
(Get-Variable $Variable_I).value.Font = "Eras ITC, 8"
(Get-Variable $Variable_I).value.checked = $false #$true
(Get-Variable $Variable_I).value.Add_CheckStateChanged({ Write-Host $Variable_I })
}
$i = 0
ForEach ($_ in $Programme_II ) {
$Variable_II = $Programme_II[$i]
New-Variable -Name $Variable_II -Value (New-Object System.Windows.Forms.CheckBox) -Force
$Window.Controls.Add((Get-Variable $Variable_II).Value)
(Get-Variable $Variable_II).value.Text = $_
$i++
$Y = $i * 20
(Get-Variable $Variable_II).value.Location = New-Object System.Drawing.Size(300, $Y)
(Get-Variable $Variable_II).value.Size = New-Object System.Drawing.Size(240, 20)
(Get-Variable $Variable_II).value.Font = "Eras ITC, 8"
(Get-Variable $Variable_II).value.checked = $false #$true
(Get-Variable $Variable_II).value.Add_CheckStateChanged({ Write-Host $Variable_II })
}
$i = 0
ForEach ($_ in $Programme_III ) {
$Variable_III = $Programme_III[$i]
New-Variable -Name $Variable_III -Value (New-Object System.Windows.Forms.CheckBox) -Force
$Window.Controls.Add((Get-Variable $Variable_III).Value)
(Get-Variable $Variable_III).value.Text = $_
$i++
$Y = $i * 20
(Get-Variable $Variable_III).value.Location = New-Object System.Drawing.Size(540, $Y)
(Get-Variable $Variable_III).value.Size = New-Object System.Drawing.Size(240, 20)
(Get-Variable $Variable_III).value.Font = "Eras ITC, 8"
(Get-Variable $Variable_III).value.checked = $false #$true
(Get-Variable $Variable_III).value.Add_CheckStateChanged({ Write-Host $Variable_III })
}
$Window.Controls.Add($Variable_I)
$Window.Controls.Add($Variable_II)
$Window.Controls.Add($Variable_III)
$Button_I = New-Object System.Windows.Forms.Button
$Button_I.Location = New-Object System.Drawing.Size(200,500)
$Button_I.Size = New-Object System.Drawing.Size(140,40)
$Button_I.Font = "Eras ITC, 10"
$Button_I.ForeColor = "gray"
$Button_I.Text = "Check all"
$Button_I.TextAlign = "MiddleCenter"
$Button_I.Add_Click({
(Get-Variable $Variable_I).value.CheckState = "Checked"
(Get-Variable $Variable_II).value.CheckState = "Checked"
(Get-Variable $Variable_III).value.CheckState = "Checked"
})
$Button_II = New-Object System.Windows.Forms.Button
$Button_II.Location = New-Object System.Drawing.Size(500,500)
$Button_II.Size = New-Object System.Drawing.Size(140,40)
$Button_II.Font = "Eras ITC, 10"
$Button_II.ForeColor = "gray"
$Button_II.Text = "Programme kopieren"
$Button_II.TextAlign = "MiddleCenter"
$Button_II.Add_Click({
# $Shell = New-Object -ComObject "Shell.Application"
# $Item = $Shell.Namespace(" Ziel Ordner ")
# $Item.CopyHere(" Ordner ")
# $file.DirectoryName + "\"
})
$Window.Controls.Add($Button_I)
$Window.Controls.Add($Button_II)
[void] $Window.ShowDialog()
} GenerateForm
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 323410
Url: https://administrator.de/contentid/323410
Ausgedruckt am: 27.11.2024 um 13:11 Uhr
11 Kommentare
Neuester Kommentar
Moin,
du gehst das ganze mit den Variablen falsch an. Mach es besser so das du jede Checkbox die du erstellst einem Array hinzufügst. Zum Schluss im Button Event durchläufst du dann das Array der Checkboxen und ermittelst deren Status. Das kannst du ja leicht mit einem where-object machen welches das Array nach gecheckten Checkboxen filtert.
Alternativ kannst du den Checkboxen im Namen ein eindeutiges Prefix geben und dann zum Schluss alle Controls mit einem Where-Object nach Controls der Klasse Checkbox und dem spezifischen Prefix filtern und dann deren Status ermitteln.
Gruß mikrotik
du gehst das ganze mit den Variablen falsch an. Mach es besser so das du jede Checkbox die du erstellst einem Array hinzufügst. Zum Schluss im Button Event durchläufst du dann das Array der Checkboxen und ermittelst deren Status. Das kannst du ja leicht mit einem where-object machen welches das Array nach gecheckten Checkboxen filtert.
Alternativ kannst du den Checkboxen im Namen ein eindeutiges Prefix geben und dann zum Schluss alle Controls mit einem Where-Object nach Controls der Klasse Checkbox und dem spezifischen Prefix filtern und dann deren Status ermitteln.
Gruß mikrotik
Servus Markus,
ich glaube du hast @131381 da ziemlich falsch verstanden.
Hier mal ein Beispiel wie man es mit dem Array macht:
Grüße Uwe
ich glaube du hast @131381 da ziemlich falsch verstanden.
Hier mal ein Beispiel wie man es mit dem Array macht:
#Generated Form Function
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
$form1 = New-Object System.Windows.Forms.Form
$btnListChecked = New-Object System.Windows.Forms.Button
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
# Array welches später die erzeugten Checkboxen enthält
$global:array_checkboxes = @()
$handler_btnListChecked_Click=
{
# Abfragen welche der Checkboxen aktiviert wurden
$checked_boxes = ($global:array_checkboxes | ?{$_.Checked} | %{$_.Text}) -join "`r`n"
# Anzeigen was aktiviert wurde
[System.Windows.Forms.MessageBox]::Show("Aktivierte Checkboxen: `r`n$checked_boxes")
}
$handler_form1_Load= {
# 10 Checkboxen erzeugen und dem Array hinzufügen
1..10 | %{
$cb = New-Object System.Windows.Forms.CheckBox
$cb.Name = "Programm_$_"
$cb.Location = New-Object System.Drawing.Point(12,[int]($_*20+5))
$cb.Size = New-Object System.Drawing.Size(104,24)
$cb.Text = "Programm_$_"
$cb.UseVisualStyleBackColor = $True
$form1.Controls.Add($cb)
$global:array_checkboxes += $cb
}
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 395
$System_Drawing_Size.Width = 534
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"
$form1.Text = "Checkbox-Demo"
$form1.add_Load($handler_form1_Load)
$btnListChecked.Anchor = 10
$btnListChecked.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 382
$System_Drawing_Point.Y = 360
$btnListChecked.Location = $System_Drawing_Point
$btnListChecked.Name = "btnListChecked"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 140
$btnListChecked.Size = $System_Drawing_Size
$btnListChecked.TabIndex = 0
$btnListChecked.Text = "List checked"
$btnListChecked.UseVisualStyleBackColor = $True
$btnListChecked.add_Click($handler_btnListChecked_Click)
$form1.Controls.Add($btnListChecked)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
GenerateForm
Ich würde direkt beim Auslesen der Programme aus den Pfaden das Verzeichnis der Einfachheit halber in die Eigenschaft Tag der Checkbox schreiben dann kannst du sie hinterher direkt beim Auslesen der Checked-Property abfragen.
Wenn du Compare nutzt musst du aufpassen das die zu vergleichenden Eigenschaften oder Objekte vom gleichen Typ sind, so wie du es oben machst kann es also aus Prinzip nicht funktionieren, da du hier Äpfel mit Birnen vergleichst .
Deine Konstrukte sind viel zu umständlich gedacht, sorry wenn ich das hier leider sagen muss .
Wenn du Compare nutzt musst du aufpassen das die zu vergleichenden Eigenschaften oder Objekte vom gleichen Typ sind, so wie du es oben machst kann es also aus Prinzip nicht funktionieren, da du hier Äpfel mit Birnen vergleichst .
Deine Konstrukte sind viel zu umständlich gedacht, sorry wenn ich das hier leider sagen muss .
Kein Problem, mach dir einfach ein Object mit beiden Eigenschaften
Falls du so ein Konstrukt nicht kennst, das nennt sich Calculated Property.
Das Objekt kannst du Filtern oder auf beide Eigenschaften zugreifen und mit Schleife durchlaufen wie bei anderen Objekten auch.
$data = gci $root -Filter *.vbs -Recurse | Select @{n="Name";e={(gc $_.Fullname -Head 1).trim("' ")}},DirectoryName
$data
Das Objekt kannst du Filtern oder auf beide Eigenschaften zugreifen und mit Schleife durchlaufen wie bei anderen Objekten auch.