Powershell сохраняет выбор сетки данных при изменении нескольких флажков

#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.