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

PowerShell WinForms ListBox去重:移除重复子部门数据

解决PowerShell WinForms层级选择程序的子部门重复问题

原程序的核心问题在于,部门选择事件中会同时读取多个公司的子部门哈希表($hashCOMPANY1、$hashCOMPANY2),导致不同公司下的同名部门子部门被重复加载到子部门列表中(例如COMPANY-1与COMPANY-2的Department 10子部门会被合并显示,出现重复项)。

以下是修改后的完整代码:

# 重构数据结构:主哈希存储公司-部门映射,子部门哈希按公司分组
$companyDepartments = @{
    'COMPANY-4' = 'Department 1','Department 2','Department 3'
    'COMPANY-3' = 'Department 4','Department 5','Department 6'
    'COMPANY-2' = 'Department 7','Department 8','Department 9','Department 10'
    'COMPANY-1' = 'Department 10','Department 11','Department 12'
}

$companySubDepartments = @{
    'COMPANY-1' = @{
        'Department 10' = 'SubDep-1','SubDep-2','SubDep-3','SubDep-4'
        'Department 11' = 'SubDep-5','SubDep-6','SubDep-7','SubDep-8'
        'Department 12' = 'SubDep-9','SubDep-10','SubDep-11','SubDep-12'
    }
    'COMPANY-2' = @{
        'Department 7' = 'SubDep-1','SubDep-2','SubDep-3','SubDep-4'
        'Department 8' = 'SubDep-5','SubDep-6','SubDep-7','SubDep-8'
        'Department 9' = 'SubDep-9','SubDep-10','SubDep-11','SubDep-12'
        'Department 10' = 'SubDep-9','SubDep-13','SubDep-14','SubDep-15'
    }
    # 其他公司若无对应子部门可留空或补充
    'COMPANY-3' = @{}
    'COMPANY-4' = @{}
}

# 初始化主窗体
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text = "层级选择程序"
$main_form.Size = New-Object System.Drawing.Size(700,400)

# 公司ComboBox
$ComboBoxOrganization = New-Object System.Windows.Forms.ComboBox
$ComboBoxOrganization.Sorted = $true
foreach($org in $companyDepartments.Keys){ 
    $ComboBoxOrganization.Items.Add($org)
}
$ComboBoxOrganization.Location  = New-Object System.Drawing.Point(180,30)
$ComboBoxOrganization.SelectedIndex = 0
$ComboBoxOrganization.Add_SelectedIndexChanged({
    $listBoxDepartments.BeginUpdate()
    $listBoxDepartments.Items.Clear()
    foreach ($dept in $companyDepartments[$this.SelectedItem]) {  
        [void]$listBoxDepartments.Items.Add($dept)
    }
    # 切换公司时清空子部门列表,避免残留数据
    $listBoxSubDepartments.BeginUpdate()
    $listBoxSubDepartments.Items.Clear()
    $listBoxSubDepartments.EndUpdate()
    $listBoxDepartments.EndUpdate()
})
$main_form.Controls.Add($ComboBoxOrganization)

# 部门ListBox
$listBoxDepartments = New-Object System.Windows.Forms.ListBox
$listBoxDepartments.Location = '180,75'
$listBoxDepartments.Size = '400,100'
$listBoxDepartments.Sorted   = $true
$listBoxDepartments.Add_SelectedIndexChanged({
    $listBoxSubDepartments.BeginUpdate()
    $listBoxSubDepartments.Items.Clear()
    # 获取当前选中的公司和部门,仅加载对应子部门
    $selectedCompany = $ComboBoxOrganization.SelectedItem
    $selectedDept = $this.SelectedItem
    if ($companySubDepartments.ContainsKey($selectedCompany) -and $companySubDepartments[$selectedCompany].ContainsKey($selectedDept)) {
        foreach($SubDep in $companySubDepartments[$selectedCompany][$selectedDept]) {
            [void]$listBoxSubDepartments.Items.Add($SubDep)
        }
    }
    $listBoxSubDepartments.EndUpdate()
})
$main_form.Controls.Add($listBoxDepartments)

# 子部门ListBox
$listBoxSubDepartments = New-Object System.Windows.Forms.ListBox
$listBoxSubDepartments.Location = '180,195'
$listBoxSubDepartments.Size = '400,100'
$listBoxSubDepartments.Sorted   = $true

$main_form.Controls.Add($listBoxSubDepartments)

$main_form.ShowDialog()

修改要点

  • 重构数据结构:将子部门哈希表按公司分组,统一存入$companySubDepartments,让子部门与所属公司直接绑定,避免跨公司读取数据。
  • 优化部门选择逻辑:选择部门时,先获取当前选中的公司,再读取该公司对应部门的子部门,确保只加载当前公司的子部门数据,彻底避免重复。
  • 补充公司切换处理:切换公司时自动清空子部门列表,避免残留之前的子部门数据。

内容的提问来源于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 08:10:06