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

PowerShell WinForms:ComboBox选项联动更新ListBox及滚动设置问题

PowerShell WinForms 两个问题的解决方案

问题1:ComboBox选择组织后自动更新ListBox的部门列表

要实现该功能,需为ComboBoxOrganization添加SelectedIndexChanged事件处理逻辑,在用户切换选项时动态更新ListBox内容:

  1. 将组织与部门的对应关系整理为哈希表,便于后续快速查找
  2. 编写事件处理脚本块,清空ListBox后根据选中组织加载对应部门的复选框
  3. 将事件绑定到ComboBox的SelectedIndexChanged事件

问题2:实现ListBox的正常滚动功能

当前代码滚动异常的原因及修正方案:

  • 原代码设置AutoSize = $true会导致ListBox随内容自动扩展,不会触发滚动,需改为固定大小
  • ScrollAlwaysVisible = $false会隐藏滚动条,需设为$true确保滚动条始终显示
  • 添加控件时需正确计算位置,确保ListBox能识别内容范围以触发滚动

完整修正代码

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

<#----======= 组织与部门映射 =======----#>
# 用哈希表存储组织和对应部门,提升可维护性
$OrgDepartments = @{
    "OOO 'COMPANY-1'" = @("Department 1","Department 2","Department 3","Department 4")
    "OOO 'COMPANY-2'" = @("Department 5","Department 6","Department 7")
    "OOO 'COMPANY-3'" = @("Department 8","Department 9")
    "OOO 'COMPANY-4'" = @("Department 10")
}
$Organizations = $OrgDepartments.Keys

<#----======= 基础窗体 =======----#>
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='Создание пользовательской учетной записи в домене'
$main_form.Width = 100
$main_form.Height = 100
$main_form.AutoSize = $true

<#----======= ФИО标签 =======----#>
$LabelFIO = New-Object System.Windows.Forms.Label
$LabelFIO.Text = "ФИО (полностью)"
$LabelFIO.Font = New-Object System.Drawing.Font("Comic Sans MS",8,[System.Drawing.FontStyle]::Regular)
$LabelFIO.Location  = New-Object System.Drawing.Point(2,10)
$LabelFIO.AutoSize = $true
$main_form.Controls.Add($LabelFIO)

<#----======= ФИО输入框 =======----#>
$TextBoxFIO = New-Object System.Windows.Forms.TextBox
$TextBoxFIO.Location  = New-Object System.Drawing.Point(2,30)
$TextBoxFIO.Text = ""
$TextBoxFIO.Size = New-Object System.Drawing.Size(155,20)
$main_form.Controls.Add($TextBoxFIO)

<#----======= Имя标签 =======----#>
$LabelName = New-Object System.Windows.Forms.Label
$LabelName.Text = "Имя"
$LabelName.Font = New-Object System.Drawing.Font("Comic Sans MS",8,[System.Drawing.FontStyle]::Regular)
$LabelName.Location  = New-Object System.Drawing.Point(2,55)
$LabelName.AutoSize = $true
$main_form.Controls.Add($LabelName)

<#----======= Имя输入框 =======----#>
$TextBoxName = New-Object System.Windows.Forms.TextBox
$TextBoxName.Location  = New-Object System.Drawing.Point(2,75)
$TextBoxName.Text = ""
$TextBoxName.Size = New-Object System.Drawing.Size(155,20)
$main_form.Controls.Add($TextBoxName)

<#----======= Фамилия标签 =======----#>
$LabelSurname = New-Object System.Windows.Forms.Label
$LabelSurname.Text = "Фамилия"
$LabelSurname.Font = New-Object System.Drawing.Font("Comic Sans MS",8,[System.Drawing.FontStyle]::Regular)
$LabelSurname.Location  = New-Object System.Drawing.Point(2,100)
$LabelSurname.AutoSize = $true
$main_form.Controls.Add($LabelSurname)

<#----======= Фамилия输入框 =======----#>
$TextBoxSurname = New-Object System.Windows.Forms.TextBox
$TextBoxSurname.Location  = New-Object System.Drawing.Point(2,120)
$TextBoxSurname.Text = ""
$TextBoxSurname.Size = New-Object System.Drawing.Size(155,20)
$main_form.Controls.Add($TextBoxSurname)

<#----======= Организация标签 =======----#>
$LabelOrg = New-Object System.Windows.Forms.Label
$LabelOrg.Text = "Организация"
$LabelOrg.Font = New-Object System.Drawing.Font("Comic Sans MS",8,[System.Drawing.FontStyle]::Regular)
$LabelOrg.Location  = New-Object System.Drawing.Point(180,10)
$LabelOrg.AutoSize = $true
$main_form.Controls.Add($LabelOrg)

<#----======= Организация下拉框 =======----#>
$ComboBoxOrganization = New-Object System.Windows.Forms.ComboBox
foreach ($Organization in $Organizations) {
    [void]$ComboBoxOrganization.Items.Add($Organization) 
}
$ComboBoxOrganization.Location  = New-Object System.Drawing.Point(180,30)
$ComboBoxOrganization.Size = New-Object System.Drawing.Size(155,20)
$main_form.Controls.Add($ComboBoxOrganization)

<#----======= 部门列表框 =======----#>
$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(180,75)
# 设置固定大小,取消自动扩展
$listBox.Size = New-Object System.Drawing.Size(155, 120)
# 始终显示滚动条
$listBox.ScrollAlwaysVisible = $true
# 启用水平滚动条(按需)
$listBox.HorizontalScrollbar = $true
$main_form.Controls.Add($listBox)

<#----======= ComboBox选择事件处理 =======----#>
$ComboBoxOrganization.add_SelectedIndexChanged({
    # 清空ListBox中的所有控件
    $listBox.Controls.Clear()
    
    $selectedOrg = $this.SelectedItem
    if (-not $selectedOrg) { return }
    
    # 获取对应部门列表
    $departments = $OrgDepartments[$selectedOrg]
    if (-not $departments) { return }
    
    # 添加部门复选框
    $yPos = 5
    foreach ($dept in $departments) {
        $CheckBox = New-Object System.Windows.Forms.CheckBox
        $CheckBox.Location = New-Object System.Drawing.Point(2, $yPos)
        $CheckBox.Text = $dept
        $CheckBox.AutoSize = $true
        $listBox.Controls.Add($CheckBox)
        $yPos += 17
    }
})

# 初始化时默认加载第一个组织的部门
if ($Organizations.Count -gt 0) {
    $ComboBoxOrganization.SelectedItem = $Organizations[0]
}

$main_form.ShowDialog()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:27:08