newbi2009
Goto Top

Powershell - Nur TRUE für eine Checkbox erlauben

Hallo zusammen,

ich habe in Powershell 10 Checkboxen. Ich möchte nur erlauben, dass eine von diesen 10 CheckBoxen markiert werden kann.

Nun könnte ich, wenn ich nur 2 Checkboxen hätte, recht einfach mit folgendem Code verhindern, dass die 2. CheckBox gleichzeitig $True ist


$checkbox1.Add_CheckStateChanged({
if ($checkBox1.Checked){ $checkbox2.Enabled = $false }
})

Wie mache ich es denn am geschicktesten mit meinen 10 Checkboxen? Es gibt doch sicherlich einen eleganteren Weg, als 10 If-Abfragen zu erstellen, und in jeder Abfrage die anderen 9 Checkboxen auf Enabled = $False zu setzen. Aber irgendwie wüsste ich gerade nicht WIE.
Habt Ihr eine Anregung für mich?

Danke Euch
Holger

Content-Key: 3134362354

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

Ausgedruckt am: 25.04.2024 um 06:04 Uhr

Mitglied: emeriks
emeriks 21.06.2022 um 14:51:04 Uhr
Goto Top
Hi,
wäre möglicherweise nicht RadioButton die bessere Wahl, statt CheckBox?

E.
Mitglied: colinardo
colinardo 21.06.2022 aktualisiert um 16:19:45 Uhr
Goto Top
Servus Holger.
Zitat von @emeriks:
wäre möglicherweise nicht RadioButton die bessere Wahl, statt CheckBox?
Wäre auch meine Wahl ...

2 Beispiel für dich:

back-to-topRadio Buttons

function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form1 = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,300'  
        Text = "Radio Buttons"  
    }
    $group = New-Object System.Windows.Forms.GroupBox -P @{
        Text = 'MyRadios'  
        Size = '180,240'  
        Location = '10,10'  
    }
    $radios = 1..10 | %{
        New-Object System.Windows.Forms.RadioButton -P @{
            Location = "10,$($_*20)"  
            Size = '150,20'  
            Anchor = 'Top,Left,Right'  
            Text = "Radio $_"  
        }
    }
    $group.Controls.AddRange($radios)

    $btn = New-Object System.Windows.Forms.Button -P @{
        Text = "OK"  
        Location = '140,260'  
        Size = '50,30'  
        add_Click = {
            $form1.Close()
        }
    }
    $form1.Controls.AddRange(@($group,$btn))
    [void]$form1.ShowDialog()
    $radios | ?{$_.Checked} | select -Expand Text
}
GenerateForm

Mit Checkboxen geht's aber auch wenn's sein muss

back-to-topCheckboxes

function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form1 = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,300'  
        Text = "Radio Buttons"  
    }
    $group = New-Object System.Windows.Forms.GroupBox -P @{
        Text = 'My checkboxes'  
        Size = '180,240'  
        Location = '10,10'  
    }
    $boxes = 1..10 | %{
        New-Object System.Windows.Forms.CheckBox -P @{
            Location = "10,$($_*20)"  
            Size = '150,20'  
            Anchor = 'Top,Left,Right'  
            Text = "Checkbox $_"  
            add_CheckedChanged = {
                $checked = $boxes | ?{$_.Checked} 
                if ($checked.Count -gt 1){
                    $checked | %{$_.Checked = $false}
                    $this.Checked = $true
                }
            }
        }
    }
    $group.Controls.AddRange($boxes)

    $btn = New-Object System.Windows.Forms.Button -P @{
        Text = "OK"  
        Location = '140,260'  
        Size = '50,30'  
        add_Click = {
            $form1.Close()
        }
    }
    $form1.Controls.AddRange(@($group,$btn))
    [void]$form1.ShowDialog()
    $boxes | ?{$_.Checked} | select -Expand Text
}
GenerateForm
Grüße Uwe
Mitglied: newbi2009
newbi2009 21.06.2022 um 21:09:44 Uhr
Goto Top
Hi vielen Dank für den Tipp - ich schaue mir das morgen mal etwas genauer an.....
Mitglied: newbi2009
newbi2009 22.06.2022 um 07:30:51 Uhr
Goto Top
Hallo nochmal, ich habe mir die beiden Codes einmal angeschaut- sehr cool, sind wesentlich kürzer, als meiner. Ich glaube, ich habe echt noch viiiieeel zu lernen!!!
Aber um ehrlich zu sein verstehe ich nicht, was folgender Code macht

  $boxes = 1..10 | %{
        New-Object System.Windows.Forms.CheckBox -P @{
            Location = "10,$($_*20)"  
            Size = '150,20'  
            Anchor = 'Top,Left,Right'  
            Text = "Checkbox $_"  
            add_CheckedChanged = {
                $checked = $boxes | ?{$_.Checked} 
                if ($checked.Count -gt 1){
                    $checked | %{$_.Checked = $false}
                    $this.Checked = $true
                }
            }
        }
    }

Ich scheitere schon alleine daran, jeder Box einen anderen Namen zu geben (nicht 1-10, sondern aaa, abc, fgb, igh,....) face-sad
Könntest Du mir da wohl nochmal auf die Sprünge helfen?

vielen Dank!
Mitglied: TK1987
Lösung TK1987 22.06.2022 aktualisiert um 07:56:28 Uhr
Goto Top
Moin,

Zitat von @newbi2009:
Ich scheitere schon alleine daran, jeder Box einen anderen Namen zu geben (nicht 1-10, sondern aaa, abc, fgb, igh,....) face-sad
1..10 erstellt ein Array aus den Zahlen von 1 bis 10, das %-Zeichen ist ein Alias für Foreach-Object - erstellt dann also für jede dieser Zahlen eine Checkbox gemäß dem Code in den geschweiften Klammern.
Könntest Du mir da wohl nochmal auf die Sprünge helfen?
Einfach den Array aus den Zahlen 1..10 durch einen Array deiner Wahl austauschen:
  $boxes = "aaa", "abc", "fgb", "igh" | %{  
  ...
}

Die Pipeline-Variable, die den Text enthält ist immer $_

Gruß Thomas
Mitglied: newbi2009
newbi2009 22.06.2022 um 08:28:55 Uhr
Goto Top
Hallo Thomas,

danke! Das hilft meinem Verständnis etwas auf die Sprünge! face-smile
Mitglied: TK1987
TK1987 22.06.2022 um 08:47:11 Uhr
Goto Top
Zitat von @newbi2009:
danke! Das hilft meinem Verständnis etwas auf die Sprünge! face-smile
Gerne.

Noch zur Info: Die Location-Zeile musst du natürlich ebenfalls anpassen, da @colinardo hier mit dem Wert aus den Array von 1-10 gerechnet hat. Am besten ersetzt du den Wert hier durch eine andere Variable und erhöhst diese dann immer entsprechend für die nächste Checkbox, also z.B.:
$boxes = "aaa", "abc", "fgb", "igh" | %{ $Y=20 }{  
  New-Object System.Windows.Forms.CheckBox -P @{
    Location = "10,$Y"  
    $Y += 20
  ...
}

Gruß Thomas