PowerShell WinForms:ComboBox选项联动更新ListBox及滚动设置问题
PowerShell WinForms 两个问题的解决方案
问题1:ComboBox选择组织后自动更新ListBox的部门列表
要实现该功能,需为ComboBoxOrganization添加SelectedIndexChanged事件处理逻辑,在用户切换选项时动态更新ListBox内容:
- 将组织与部门的对应关系整理为哈希表,便于后续快速查找
- 编写事件处理脚本块,清空ListBox后根据选中组织加载对应部门的复选框
- 将事件绑定到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
相关产品推荐
相关产品推荐

