bugger
Goto Top

Powershell Dynamischen Checkboxen

Hallo,

ich probiere ich mich gerade an Dynamischen Checkboxen und habe dieses Script:

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  

$form1 = New-Object System.Windows.Forms.Form
$button1 = New-Object System.Windows.Forms.Button
$listBox1 = New-Object System.Windows.Forms.ListBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState


#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------

$handler_button1_Click= 
{
    $listBox1.Items.Clear();

    # Keep track of whether something has been added to the list
    $ContentPresent = $false
    # Iterate over the checkboxes, one by one
    foreach($CheckBox in $CheckBoxes){
        if($CheckBox.Checked){
            $listBox1.Items.Add("{0} (with value ""{1}"") has been checked" -f ($CheckBox.Name,$CheckBox.Text))  
            $ContentPresent = $True
        }
    }

    # If something was already added to the list, no need to show default message
    if (-not $ContentPresent) { $listBox1.Items.Add("No CheckBox selected....") }   
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$form1.Text = "Primal Form"  
$form1.Name = "form1"  
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 450
$System_Drawing_Size.Height = 236
$form1.ClientSize = $System_Drawing_Size

$button1.TabIndex = 4
$button1.Name = "button1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$button1.Size = $System_Drawing_Size
$button1.UseVisualStyleBackColor = $True

$button1.Text = "Run Script"  

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 27
$System_Drawing_Point.Y = 156
$button1.Location = $System_Drawing_Point
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$button1.add_Click($handler_button1_Click)

$form1.Controls.Add($button1)

$listBox1.FormattingEnabled = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 301
$System_Drawing_Size.Height = 212
$listBox1.Size = $System_Drawing_Size
$listBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$listBox1.Name = "listBox1"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 137
$System_Drawing_Point.Y = 13
$listBox1.Location = $System_Drawing_Point
$listBox1.TabIndex = 3

$form1.Controls.Add($listBox1)


# Keep track of number of checkboxes
$CheckBoxCounter = 1

$CheckBoxLabels=@(
"Test1"  
"Test2"  
"Test3"  
)

# When we create a new textbox, we add it to an array for easy reference later
$CheckBoxes = foreach($Label in $CheckBoxLabels) {
    $CheckBox = New-Object System.Windows.Forms.CheckBox        
    $CheckBox.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 104
    $System_Drawing_Size.Height = 24
    $CheckBox.Size = $System_Drawing_Size
    $CheckBox.TabIndex = 2

    # Assign text based on the input
    $CheckBox.Text = $Label

    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    # Make sure to vertically space them dynamically, counter comes in handy
    $System_Drawing_Point.Y = 15 + (($CheckBoxCounter - 1) * 20)
    $CheckBox.Location = $System_Drawing_Point
    $CheckBox.DataBindings.DefaultDataSourceUpdateMode = 0

    # Give it a unique name based on our counter
    $CheckBox.Name = "CheckBox$CheckBoxCounter"  

    # Add it to the form
    $form1.Controls.Add($CheckBox)
    # return object ref to array
    $CheckBox
    # increment our counter
    $CheckBoxCounter++
}


#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

Was ich jetzt nicht herausgefunden habe ist, wie ich bestimmte Checkboxen auswähle. Möglicherweise habe ich google auch nur die falschen Fragen gestellt.^^
Wenn man die Checkboxen einzeln hat, kann ich diese ja auch explizit anwählen.
Also z.B. if ( $checkboxTest.Checked -eq $true ) {write-host "yeah"}

Wie kann ich denn in dem Script oben die Checkbox Test2 direkt ansprechen wie bei einer einzelnen Checkbox?

Danke und Gruß

Content-ID: 561381

Url: https://administrator.de/contentid/561381

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

143127
Lösung 143127 27.03.2020 aktualisiert um 15:39:37 Uhr
Goto Top
Wenn man die Checkboxen einzeln hat, kann ich diese ja auch explizit anwählen.
So wie du es auch hinzufügst, über die Controls Collection der Form
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.control ...
$form1.Controls['Checkbox2']  
Bugger
Bugger 27.03.2020 um 15:47:00 Uhr
Goto Top
Vielen Dank, funktioniert face-smile

Geht auch ein aufruf über den Namen also z.B. Test2 anstatt Checkbox2? Weiß noch nicht was mir besser gefallen würde, dass muss ich mir dann nochmal überlegen.
143127
Lösung 143127 27.03.2020 aktualisiert um 15:51:49 Uhr
Goto Top
Zitat von @Bugger:
Geht auch ein aufruf über den Namen also z.B. Test2 anstatt Checkbox2?
Ja klar, die kannst du ganz normal wie in Powershell üblich über ein Where Object ausfiltern, dafür ist es ja eine Collection aus Controls-Objekten mit den entsprechenden Eigenschaften face-smile ...
$cb = $form1.Controls | ? Text -eq 'Test2'  
143127
143127 27.03.2020 aktualisiert um 16:06:06 Uhr
Goto Top
Zitat von @Bugger:
Weiß noch nicht was mir besser gefallen würde, dass muss ich mir dann nochmal überlegen.
Du kannst auch einen Eventhandler an jede Checkbox klemmen und die autoamtisch ausgeführt wird wenn z.B. eine Checkbox geklickt wird, je nachdem was du mit den Boxen halt machen willst.

Beispiel (Jede Box erhält einen Klick-Handler, oder du nutzt den CheckedChanged Handler)
1..5 | %{
    $cb = New-Object System.Windows.Forms.CheckBox
    $cb.name = "Checkbox$_"  
    $cb.Checked = $false
    $cb.Text = "Checkbox$_"  
    $cb.Left = 50
    $cb.Top = $_ * 20
    $cb.add_click({
        [System.Windows.Forms.MessageBox]::Show($this.Name + " : " + $this.Checked)  
    })
    $form1.Controls.Add($cb) 
}
Bugger
Bugger 27.03.2020 um 16:05:44 Uhr
Goto Top
Also Plan ist das erst etwas passiert wenn man auf den Knopf drückt. Ich stehe noch etwas auf dem Schlauch aber wir sind kurz vor dem Ziel :D

In dieser Form unten funktioniert das ja, aber wenn es auf dem Text basiert führt er immer den Text Code aus auch wenn die Box nicht ausgewählt ist
    if ( $form1.Controls['Checkbox2'].Checked -eq $true ){write-host "test2"}  
    if ( $form1.Controls['Checkbox5'].Checked -eq $true ){write-host "test5"}  
143127
143127 27.03.2020 aktualisiert um 16:11:12 Uhr
Goto Top
??
Siehe mein letzten Code der filtert nach dem enthaltenen Text und der Funktioniert problemlos

if (($form1.Controls | ? Text -eq 'Test2').Checked){  
     write-host "test2"  
}
Bugger
Bugger 27.03.2020 um 16:16:19 Uhr
Goto Top
Zitat von @143127:
Powershell-Grundkurs übersprungen?

Natürlich, nur um dich wuschig zu machen. :D

Ich war doof und habe den anderen Code Teil nicht gelöscht und deswegen wurde das doppelt ausgeführt.^^

Funktioniert alles wunderbar, vielen vielen Dank face-smile