Powershell: CheckBox.Add_CheckStateChanged - PullRequest
0 голосов
/ 27 мая 2019

Я начал с формул powershell, и это моя первая попытка.

Я хотел бы добавить больше флажков, и у меня нет проблем с "CheckStateChanged". Я ищу альтернативный код с объявлением foreach. Как я могу сократить код с помощью своих флажков, используя foreach x в y?

Моя первая попытка работает хорошо:

$CheckBox1.Add_CheckStateChanged({
if ($CheckBox1.Checked){$CheckBox2.Enabled = $false} else {$CheckBox2.Enabled = $true}
if ($CheckBox1.Checked){$CheckBox3.Enabled = $false} else {$CheckBox3.Enabled = $true}
if ($CheckBox1.Checked){$CheckBox4.Enabled = $false} else {$CheckBox4.Enabled = $true}
})

$CheckBox2.Add_CheckStateChanged({
if ($CheckBox2.Checked){$CheckBox1.Enabled = $false} else {$CheckBox1.Enabled = $true}
if ($CheckBox2.Checked){$CheckBox3.Enabled = $false} else {$CheckBox3.Enabled = $true}
if ($CheckBox2.Checked){$CheckBox4.Enabled = $false} else {$CheckBox4.Enabled = $true}
})

$CheckBox3.Add_CheckStateChanged({
if ($CheckBox3.Checked){$CheckBox1.Enabled = $false} else {$CheckBox1.Enabled = $true}
if ($CheckBox3.Checked){$CheckBox2.Enabled = $false} else {$CheckBox2.Enabled = $true}
if ($CheckBox3.Checked){$CheckBox4.Enabled = $false} else {$CheckBox4.Enabled = $true}
})

$CheckBox4.Add_CheckStateChanged({
if ($CheckBox4.Checked){$CheckBox1.Enabled = $false} else {$CheckBox1.Enabled = $true}
if ($CheckBox4.Checked){$CheckBox2.Enabled = $false} else {$CheckBox2.Enabled = $true}
if ($CheckBox4.Checked){$CheckBox3.Enabled = $false} else {$CheckBox3.Enabled = $true}
})

Альтернатива, которую я ищу, может выглядеть так:

CheckBox1.Add_CheckStateChanged({ if (CheckBox1.Checked){foreach CheckBox in $_.Enabled = $false} else {$CheckBox2.Enabled = true}

К сожалению, я не могу понять, как использовать функцию foreach с флажками. Я хотел бы добавить более десяти флажков в мою форму.

1 Ответ

1 голос
/ 27 мая 2019

Я согласен с Матиасом Р. Джессеном , что я тоже думаю, что вам лучше использовать группу радиокнопок.

Однако, если вы хотите иметь взаимоисключающие флажки и сократить свой код, вы можете сделать это:

# create a scriptblock to be used in every checkboxes CheckStateChanged event
$checkChange = {
    # loop through all the forms checkbox controls.
    # the sender object is captured in the automatic variable '$this'
    $form.Controls | Where-Object {$_ -is [System.Windows.Forms.Checkbox]} | ForEach-Object {
        # if this checkbox is checked, disable all others, otherwise
        # set all checkbox controls to Enabled
        $_.Enabled = if ($this.Checked) { ($_ -eq $this) } else { $true }
    }
}

# add the scriptblock to the individual checkbox objects
$CheckBox1.Add_CheckStateChanged($checkChange)
$CheckBox2.Add_CheckStateChanged($checkChange)
$CheckBox3.Add_CheckStateChanged($checkChange)
$CheckBox4.Add_CheckStateChanged($checkChange)


Согласно вашему комментарию, да, возможно собратьвсе элементы управления флажок в массиве и использовать его для создания формы.Это может сократить ваш код, но в то же время сделать его менее читабельным.Вот пример:
$chkBoxes = @()
for ($i = 0; $i -lt 4; $i++) {
    $dummy = New-Object System.Windows.Forms.Checkbox
    $dummy.Location = New-Object System.Drawing.Size(10,(20 + $i * 20))
    # add more COMMON properties if need be.
    # individual properties need to be set on each box by index.
    # e.g. $chkBoxes[0].Cursor = [System.Windows.Forms.Cursors]::Hand

    # set the CheckStateChanged handler on the control
    $dummy.Add_CheckStateChanged($checkChange)
    # add the new control to the $chkBoxes array
    $chkBoxes += $dummy
}
# add the array of controls to the form
$form.Controls.AddRange($chkBoxes)

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...