You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:55:12