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
相关产品推荐
相关产品推荐

