PowerShell表单:取消勾选Readme后恢复Label1与TextBox1可见性
解决PowerShell WinForms中取消勾选Readme复选框后恢复控件可见性的问题
你的问题出在对复选框点击事件的处理逻辑上——你错误地使用了Remove_Click方法,这个方法是用来移除已注册的事件处理程序,而非响应取消勾选的操作。正确的做法是在点击事件里判断复选框的Checked状态,动态切换控件的可见性。
关键修改点
- 删除无效的
$CheckBox1.Remove_Click(...)代码行 - 重写
$CheckBox1的点击事件处理逻辑,根据$CheckBox1.Checked的值设置label1和textBox1的可见性:- 勾选时:隐藏控件(
Visible = $false) - 取消勾选时:显示控件(
Visible = $true)
- 勾选时:隐藏控件(
修改后的完整代码
Clear-Host [void][system.reflection.assembly]::LoadWithPartialName('System.Drawing') [void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') $objForm = New-Object System.Windows.Forms.Form $objForm.Text = 'Test' $objForm.Size = New-Object System.Drawing.Size(500,300) $objForm.StartPosition = 'CenterScreen' $CheckedListBox = New-Object System.Windows.Forms.CheckedListBox $CheckedListBox.Location = New-Object System.Drawing.Size(20,20) $CheckedListBox.size = New-Object System.Drawing.Size(45,45) $CheckedListBox.CheckOnClick = $true $CheckedListBox.Items.AddRange(1..1) $CheckedListBox.ClearSelected() $CheckBox1 = New-Object System.Windows.Forms.CheckBox $CheckBox1.Location = New-Object System.Drawing.Size(20,60) $CheckBox1.size = New-Object System.Drawing.Size(80,40) $CheckBox1.Text = "Readme" $label1 = New-Object System.Windows.Forms.Label $label1.Location = New-Object System.Drawing.Point(20,100) $label1.Size = New-Object System.Drawing.Size(280,20) $label1.Text = 'Please enter Value in Minutes:' $label1.Visible = $true $textBox1 = New-Object System.Windows.Forms.TextBox $textBox1.Location = New-Object System.Drawing.Point(20,120) $textBox1.Size = New-Object System.Drawing.Size(30,20) $textBox1.Visible = $true # 修改点击事件逻辑:根据复选框状态切换控件可见性 $CheckBox1.Add_Click({ if ($CheckBox1.Checked) { $label1.Visible = $false $textBox1.Visible = $false } else { $label1.Visible = $true $textBox1.Visible = $true } }) $objForm.Controls.Add($CheckedListBox) $objForm.Controls.Add($CheckBox1) $objForm.Controls.Add($label1) $objForm.Controls.Add($textBox1) $CheckedListBox.Add_Click({ For ($i=1;$i -lt $CheckedListBox.Items.count;$i++) {$CheckedListBox} }) $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(75,220) $okButton.Size = New-Object System.Drawing.Size(75,23) $okButton.Text = 'OK' $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $objForm.AcceptButton = $okButton $objForm.Controls.Add($okButton) # put form in front of other windows $objForm.TopMost = $True # display the form $DisplayForm = $objForm.ShowDialog() ForEach ($CheckedItem in $CheckedListBox.CheckedItems -join ',') { Switch ($CheckedItem) { 1 {"Checkbox $CheckedItem is checked";Break} 2 {"Checkbox $CheckedItem is checked";Break} 3 {"Checkbox $CheckedItem is checked";Break} {1,2} {"Checkbox $CheckedItem is checked";Break} {1,3} {"Checkbox $CheckedItem is checked";Break} {2,3} {"Checkbox $CheckedItem is checked";Break} {1..3} {"Checkbox $CheckedItem is checked";Break} } } if ($CheckBox1.Checked) { Write-Host "Readme is true" } else { Write-Host "Readme is not true" } write-host $textBox1.Text.trim()
简洁写法补充
也可以用更紧凑的逻辑实现双向切换,直接将控件的Visible属性设置为复选框Checked状态的取反:
$CheckBox1.Add_Click({ $label1.Visible = -not $CheckBox1.Checked $textBox1.Visible = -not $CheckBox1.Checked })
内容的提问来源于stack exchange,提问作者wildbushranger
相关产品推荐
相关产品推荐

