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

Printed on: April 25, 2024 at 01:04 o'clock

Member: emeriks
emeriks Jun 21, 2022 at 12:51:04 (UTC)
Goto Top
Hi,
wäre möglicherweise nicht RadioButton die bessere Wahl, statt CheckBox?

E.
Member: colinardo
colinardo Jun 21, 2022 updated at 14:19:45 (UTC)
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
Member: newbi2009
newbi2009 Jun 21, 2022 at 19:09:44 (UTC)
Goto Top
Hi vielen Dank für den Tipp - ich schaue mir das morgen mal etwas genauer an.....
Member: newbi2009
newbi2009 Jun 22, 2022 at 05:30:51 (UTC)
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!
Member: TK1987
Solution TK1987 Jun 22, 2022 updated at 05:56:28 (UTC)
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
Member: newbi2009
newbi2009 Jun 22, 2022 at 06:28:55 (UTC)
Goto Top
Hallo Thomas,

danke! Das hilft meinem Verständnis etwas auf die Sprünge! face-smile
Member: TK1987
TK1987 Jun 22, 2022 at 06:47:11 (UTC)
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