在网上搜索一个看似简单的问题:
我有一个涉及Checkedlistbox的工作脚本:
New-Object System.Windows.Forms.CheckedListBox我试图让它表现出来,以便所有检查的项目都放在下面这样的顶部:
[x]
[x]
[x]
[ ]
[ ]现在看起来是这样的:
[ ]
[ ]
[X]
[ ]
[X]让核对表项目按字母顺序排序很容易,但我希望它们按“所选状态”排序。
这有可能吗?
更新 ->代码:
$clbGroups = New-Object System.Windows.Forms.CheckedListBox
$UserGroups = $clbGroups.CheckedItems
$formMain.Controls.Add($clbGroups)
$clbGroups.Location = '305, 258'
$clbGroups.Name = "clbGroups"
$clbGroups.Size = '400, 150'
$clbGroups.CheckedItems
$clbGroups.TabIndex = 37
$clbGroups.Sorted = "True"
Write-Verbose "Adding groups to checked list box"
$XML.Options.SecurityGroups.SecurityGroup | %{[Void]$clbGroups.Items.Add($_)}
$cboGroup_SelectedIndexChanged={
Write-Verbose "Updating groups fields with list information"
$Group = @($XML.Options.Groups.Group | ? {$_.Name -match $cboGroup.Text})
$arrayGroups = @($Group | % { $_.List } | ? { $_.Type -match "SecurityGroup" } | % { $_.'#text' } )
for ($i = 0; $i -lt $clbGroups.Items.Count; $i++) { if($arrayGroups -Contains $clbGroups.Items[$i]){ $clbGroups.SetItemChecked( $i, $true ) } else { $clbGroups.SetItemChecked( $i, $false ) } }
}发布于 2020-01-30 09:29:21
因此,下面是一个只使用CheckedListBox属性的脚本。由于没有内置的排序方法,这里的诀窍是创建一个自定义函数来完成它。这是由下面的function SortItems完成的。该函数将准备新项(选中和未选中),清除现有项,并按适当顺序添加新项。此外,它必须以编程方式保留已检查的项的状态。
# Simplified form setup
$formMain = New-Object System.Windows.Forms.Form
$clbGroups = New-Object System.Windows.Forms.CheckedListBox
$UserGroups = $clbGroups.CheckedItems
$formMain.Controls.Add($clbGroups)
1..10 | % {[void]$clbGroups.Items.Add("Group '$_'")}
# Function doing actual sort
function SortItems {
$CheckedItems = $clbGroups.CheckedItems | % {$_}
$UncheckedItems = $clbGroups.Items | where {$_ -notin $CheckedItems}
$clbGroups.Items.Clear()
$CheckedItems | % {$clbGroups.Items.Add($_)} | % {$clbGroups.SetItemChecked($_,$true)}
$UncheckedItems | % {$clbGroups.Items.Add($_)}
}
# Add button that will trigger the sort
$sortBtn = New-Object System.Windows.Forms.Button
$sortBtn.Add_Click({SortItems})
$sortBtn.Location = '15, 158'
$sortBtn.Text = 'Sort it!'
$formMain.Controls.Add($sortBtn)
# Show main form as dialog window
$formMain.ShowDialog()和关于代码的两个评论
需要
$CheckedItems = $clbGroups.CheckedItems | % {$_}第二个管道元素来创建项的副本,而不仅仅是引用。如果只使用引用,变量将在清除items.$CheckedItems | % {$clbGroups.Items.Add($_)} | % {$clbGroups.SetItemChecked($_,$true)}后指向空数组,第二个管道元素正在添加项。它是新创建的项的返回索引。我们在第三个管道元素中使用该索引将其检查状态设置为true。

发布于 2020-01-29 15:22:40
编辑:基于额外的用户输入,这不是一个合适的解决方案。我会发一个更好的。
我不太确定你的设置,但你可能会使用这样的东西。
首先,我模拟使用5 CheckedListBox创建新的CheckBoxes。
$CL = New-Object System.Windows.Forms.CheckedListBox
1..5 | % {$CB = New-Object System.Windows.Forms.CheckBox; $CB.Text = "CheckBox $_"; $CL.Items.Add($CB)}
$CL.Items | Select Text, Checked然后,让我们检查第三项和第五项。
$CL.Items[2].Checked = $true
$CL.Items[4].Checked = $true
$CL.Items | Select Text, Checked然后,让我们对其进行排序并打印到屏幕上。
$CL.Items | Sort Checked | Select Text, Checkedhttps://stackoverflow.com/questions/59969938
复制相似问题