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

如何在PowerShell表单中获取动态复选框列表的全部结果

动态生成WinForms复选框无法获取全部选中项的解决方案

问题场景

已通过$WindowsList存储维护机器上的已安装操作系统列表,并用以下代码动态生成复选框表单,但仅能获取最后一项选中结果,无法获取所有选中项:

Foreach ($OS in $WindowsList) {
    $SelectOS = New-Object System.Windows.Forms.Checkbox
    $SelectOS.Location = New-Object System.Drawing.Size(30,$FormHeight)
    $SelectOS.Size = New-Object System.Drawing.Size(500,20)
    $SelectOS.Text = "$OS"
    $Form.Controls.Add($SelectOS)
}

可行解决方案

方法1:遍历表单控件筛选选中项

在表单的确认逻辑(比如按钮点击事件)里,遍历表单的所有控件,挑出已勾选的复选框,提取对应文本:

# 绑定确认按钮点击事件
$ConfirmButton.Add_Click({
    $selectedOS = @()
    # 遍历所有控件
    foreach ($ctrl in $Form.Controls) {
        # 判断是复选框且已勾选
        if ($ctrl -is [System.Windows.Forms.CheckBox] -and $ctrl.Checked) {
            $selectedOS += $ctrl.Text
        }
    }
    # 处理选中结果,示例:输出到控制台
    Write-Host "选中的操作系统:$($selectedOS -join ', ')"
})

方法2:生成时将复选框存入数组

提前声明一个数组,在动态生成复选框的循环里,把每个新建的复选框对象存进去,后续直接遍历这个数组获取选中项:

# 声明空数组存储复选框对象
$osCheckboxes = @()

Foreach ($OS in $WindowsList) {
    $SelectOS = New-Object System.Windows.Forms.Checkbox
    $SelectOS.Location = New-Object System.Drawing.Size(30,$FormHeight)
    $SelectOS.Size = New-Object System.Drawing.Size(500,20)
    $SelectOS.Text = "$OS"
    $Form.Controls.Add($SelectOS)
    # 将当前复选框加入数组
    $osCheckboxes += $SelectOS
    # 更新高度避免复选框重叠
    $FormHeight += 25
}

# 确认逻辑中遍历数组获取选中项
$ConfirmButton.Add_Click({
    $selectedOS = $osCheckboxes | Where-Object { $_.Checked } | Select-Object -ExpandProperty Text
    Write-Host "选中的操作系统:$($selectedOS -join ', ')"
})

方法3:改用CheckedListBox控件(更高效)

如果场景允许,直接用CheckedListBox控件替代多个单独的复选框,原生支持批量管理选项和获取选中项:

# 创建CheckedListBox控件
$osCheckedList = New-Object System.Windows.Forms.CheckedListBox
$osCheckedList.Location = New-Object System.Drawing.Size(30, 30)
$osCheckedList.Size = New-Object System.Drawing.Size(500, 200)
# 批量添加操作系统选项
$osCheckedList.Items.AddRange($WindowsList)
$Form.Controls.Add($osCheckedList)

# 获取选中项的逻辑
$ConfirmButton.Add_Click({
    $selectedOS = $osCheckedList.CheckedItems | ForEach-Object { $_ }
    Write-Host "选中的操作系统:$($selectedOS -join ', ')"
})

内容的提问来源于stack exchange,提问作者FTBC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:02:45