#powershell #datagridview
#powershell #datagridview
Вопрос:
Я ломал голову над этой проблемой. Если у меня есть столбец с флажками в DataGridView
, как можно редактировать несколько флажков одновременно и сохранить выбор.
У меня есть следующая форма, которая отлично работает при редактировании нескольких флажков, но выделение теряется после изменения состояния ячейки. Я понимаю, что мое решение довольно нетрадиционно и не так, как описано в документах Microsoft (которым я пытался следовать, но не смог разобраться в этом).
Извините за длинный код, но это хороший пример:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object System.Windows.Forms.Form -Property @{
Size = New-Object System.Drawing.Size(232,170)
FormBorderStyle = 'FixedDialog'
MaximizeBox = $False
StartPosition = 'CenterScreen'
}
$DataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
Size = New-Object System.Drawing.Size(206,113)
Location = New-Object System.Drawing.Size(10,10)
MultiSelect = $True
SelectionMode = 'CellSelect'
AutoSizeColumnsMode = 'Fill'
AllowUserToAddRows = $False
RowHeadersVisible = $False
AllowUserToResizeColumns = $False
AllowUserToResizeRows = $False
ColumnHeadersHeightSizeMode = 'DisableResizing'
ColumnHeadersVisible = $False
}
$CheckBoxColumn = New-object System.Windows.Forms.DataGridViewCheckBoxColumn
$DataGridView.Columns.Add($CheckBoxColumn) | Out-Null
$DataGridView.ColumnCount = 1
$DataGridView.Columns[0].ReadOnly = $False
$GridData = [ordered]@{
'0' = $True; '1' = $True; '2' = $True; '3' = $True; '4' = $True
}
for($i = 0; $i -lt 5; $i ){
$DataGridView.Rows.Add($GridData[$i]) | Out-Null
}
$global:Selection = New-Object System.Collections.ArrayList
$DataGridView.Add_SelectionChanged({
if (($DataGridView.SelectedCells.RowIndex).Count -gt '1'){
$global:Selection = $DataGridView.SelectedCells.RowIndex
}
})
$DataGridView.Add_CurrentCellDirtyStateChanged({
for($i = 0; $i -lt $global:Selection.Count; $i ){
$DataGridView.Rows[$global:Selection[$i]].Cells[0].Value = $DataGridView.Rows[$DataGridView.CurrentCell.RowIndex].Cells[0].Value
}
$DataGridView.EndEdit()
$global:Selection = New-Object System.Collections.ArrayList
})
$form.Controls.Add($DataGridView)
$form.ShowDialog()
Основная часть, которую я не понимаю, как обойти, заключается в том, что при срабатывании состояния ячейки выделение стирается. Мое решение состояло в том, чтобы сначала сохранить выделение, а затем сбросить его в конце изменения статистики ячейки, чтобы затем иметь возможность снова выбрать одну ячейку.
Я знаю CellValueChanged
и пробовал это таким образом, но я всегда терпел неудачу из-за изменения выбора при изменении состояния события, как будто я преследую свой собственный хвост. У меня в голове не укладывается, возможно ли сохранить выбор.
Комментарии:
1. Ну, опубликованный код недействителен и выдает ошибку с такими вещами, как [System.Management . Автоматизация. Исключение RuntimeException: невозможно выполнить индексацию в объект типа System. Логическое значение.] И согласен, то, что вы делаете, является нетрадиционным.
2. @postanote я не получил эту ошибку, но я думаю, что это произошло при заполнении
DataGridView
данными. я исправил это в примере кода.3. Да, я исправил это при быстром просмотре вашего кода перед комментарием. Тем не менее, это все еще просто UX / UI с предварительно установленными флажками в Datagrid. Вы хотите сказать, что в этом контрольном списке вы щелкаете CRTL , чтобы выбрать их все, чтобы, скажем, редактировать несколько строк, не влияя на другую выбранную строку / ячейку?. Конечно, элементы должны иметь фокус, прежде чем вы сможете что-либо с ними сделать, и, следовательно, любой предыдущий элемент (ы) должен потерять фокус, и связанные с ним события формы запускаются. Итак, это вопрос UX / UI ZOrder / Event flow по сравнению с вопросом PowerShell, поскольку события зависят от формы. Итак, возможно, опубликовать полный код в CodeReview
4. Ну, да, для нас это проблема с кодированием, однако конечный пользователь просто ожидает, что все будет происходить определенным образом при нажатии на вещи 🙂 Для меня неожиданно потерять многострочный выбор после нажатия флажка. Возможно, то, как он ведет себя в настоящее время, соответствует ожиданиям большинства людей. Мне просто интересно, возможно ли это.
5. ;-} …. Нет .. вы не можете этого сделать. Если вы считаете, что это то же самое, скажем, в Excel, и вы многократно выбираете столбец для изменения ячейки, вы теряете столбцы. Вы выбираете строки и выбираете столбец, затем вы освобождаете строки. Ну, если вы этого не сделаете, нажмите ctrl. Сделайте то же самое, отправив материал в OGV, то же самое. Тем не менее, в вашем опубликованном коде вы показываете только chkbox, а не другие ячейки, которые нужно выбрать. Итак, разместите где-нибудь gif, чтобы показать, что вы пытаетесь сделать.
Ответ №1:
Вывод из дальнейшего тестирования и комментариев, удержание выбора невозможно (пока не будет доказана ошибка).
Любая форма взаимодействия с ячейкой сначала изменит состояние выбора. Поэтому для Powershell невозможно узнать, означает ли щелчок внутри ячейки выбор отдельной ячейки или изменение ее значения (в данном случае флажка). Оба состояния в этот самый момент выглядят точно так же для Powershell.
Возможным решением в будущем могут быть QuantumBits.