Поиски по всему интернету, казалось бы, простой проблемы:

У меня есть рабочий скрипт, включающий 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 ) } }

}
0
Barry Badpak 29 Янв 2020 в 18:04

2 ответа

Лучший ответ

Итак, вот скрипт, который будет работать с CheckedListBox только со свойством CheckedItems. Поскольку встроенного метода сортировки не существует, уловка заключается в создании пользовательской функции, которая будет это делать. Это делается 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 | % {$_} Второй трубопровод Элемент необходим для создания копии предметов, а не просто ссылки. Если мы используем только ссылку, переменная будет указывать на пустой массив после очистка предметов.
  • $ CheckedItems | % {$ clbGroups.Items.Add ($ _)} | % {$ clbGroups.SetItemChecked ($ _, $ true)} Второй элемент конвейера добавление предметов. Возвращает индекс вновь созданного элемента. Мы используем этот индекс в третьем элементе конвейера, чтобы установить его проверенное состояние true

Screenshot of the code above in the action

0
Igor 30 Янв 2020 в 09:29

РЕДАКТИРОВАТЬ: на основе дополнительного пользовательского ввода, это не подходящее решение. Я выложу лучший.

Я не совсем уверен в вашей настройке, но вы можете использовать что-то вроде этого.

Во-первых, я моделирую создание нового CheckedListBox с 5 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, Checked
0
Igor 30 Янв 2020 в 09:18