Флажок Powershell, поставить проверенные элементы сверху - PullRequest
0 голосов
/ 29 января 2020

Поиск в Интернете по-видимому простой проблемы:

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

}

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Итак, вот скрипт, который будет работать с 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 голосов
/ 29 января 2020

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

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

Сначала я имитирую создание нового 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...