Внутри блока сценария для события CheckStateChanged
переменная $i
неизвестна. Чтобы сделать его доступным, вы должны сохранить его в свойстве, которое может прочитать флажок. Лучшее место для этого - собственное свойство Tag
флажка.
В вашем коде создайте флажки следующим образом:
$charts = "x","y","z" # no need to surround this with @()
$checkBox_Charts = [System.Windows.Forms.checkbox[]]::new($charts.Count)
for ($i = 0; $i -lt $charts.Count; $i++){
$CheckBox = new-object System.Windows.Forms.checkbox
$height = (60*$i)+20
$CheckBox.Location = new-object System.Drawing.Size(100,$height)
$CheckBox.Size = '150,50'
$CheckBox.Text = $charts[$i]
$CheckBox.Checked = $false
# save the index $i in the Tag property of the checkbox itself
$CheckBox.Tag = $i
$CheckBox.Add_CheckStateChanged({
# inside this scriptblock, the variable $i is unknown
# so we use the index value stored in the Tag property earlier
Write-Host "CP2: in Add_CheckStateChanged $($this.Checked)"
Write-Host "CheckBox index: $($this.Tag)"
Write-Host $checkBox_Charts[$this.Tag]
Write-Host
})
$checkBox_Charts[$i] = $CheckBox
}
Затем удалите код, который у вас есть здесь :
########### This is the important piece ##############
# #
# Do something when the state of the checkbox changes #
#######################################################
for($i=0; $i -lt 2; $i++){
$checkBox_Charts[$i].Add_CheckStateChanged({
Write-Host "CP2: in Add_CheckStateChanged " + $checkBox_Charts[$i].Checked
Write-Host $checkBox_Charts[$i]
Write-Host $i})
}
, поскольку теперь все это делается при создании флажков ранее (и не будет работать, как вы заметили)
В качестве sidenotes:
изменить этот устаревший / устаревший код:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
на
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing</p></li>
<li><p>straighten the curly quotes you have in <code>$Form.Text = ”My First Form with a working checkbox”</code> to become <code>$Form.Text = "My First Form with a working checkbox"</code>.<br>
They won't hurt you in this case, but using curly quotes in code can lead to numerous weird problems. <strong>Never use them in code</strong>.
Внутри обработчик события элемента управления, переменная $this
automati c относится к самому элементу управления