Powershell:选中列 header 未知的一行中的所有复选框
Powershell: Check all checkboxes in a row where column header is unknown
我在创建 "SelectAll" 复选框列时遇到问题,该列实际上选择了 ROW 中的所有复选框,而不是列中的所有复选框。 "SelectALL" 列是 table 中的第三列,我想在同一行中选中它之后的所有框。 "SelectALL" 列之后的列名是动态生成的,因此在 table 生成之前列名是未知的。到目前为止,这是我的代码:
$CheckAll_click = {
for($i=0;$i -lt $DGV1.RowCount;$i++){
if($DGV1.Rows[$i].Cells['SelectAll'].Value -eq $true) {
for($j=3;$j -le $DGV1.ColumnCount;$j++){
($DGV1.Rows[$i].Cells | ?{$_.ColumnIndex -eq $j}).Value=$true
}
}
else {
for($j=3;$j -le $DGV1.ColumnCount;$j++){
($DGV1.Rows[$i].Cells | ?{$_.ColumnIndex -eq $j}).Value=$false
}
}
}
这比我预期的要难。诀窍(来自 here)是在尝试读取 SelectAll 复选框的状态之前触发 CommitEdit
。 $Sender
和 $EventArgs
(为了便于阅读,在下面缩写为 $e
)在您尝试找出选中了哪个复选框时可能是有用的参数。
@("System.Windows.Forms","System.Drawing") | %{[reflection.assembly]::LoadWithPartialName($_) | Out-Null}
$form = New-Object System.Windows.Forms.Form -Property @{Size=New-Object System.Drawing.Size(900,600)}
$dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{Anchor = "Left,Right,Top,Bottom";Size='870,550'}
@('SelectAll','Col1','Col2') | %{
$dataGridView.columns.Add( (New-Object Windows.Forms.DataGridViewCheckBoxColumn -Property @{Name=$_; TrueValue=$true; FalseValue=$false})) | Out-Null
}
1..4 | %{
$dataGridView.Rows.Add((New-Object System.Windows.Forms.DataGridViewRow)) | Out-Null
}
$dataGridView.add_CellContentClick({param($sender,$e)
if($dataGridView.Rows[$e.RowIndex].Cells[$e.ColumnIndex].OwningColumn.HeaderText -ne 'SelectAll'){return}
[Windows.Forms.DataGridViewCheckBoxCell] $ChkSelectAll = $dataGridView.Rows[$e.RowIndex].Cells |
?{$_.OwningColumn.HeaderText -eq 'SelectAll'}
$dataGridView.CommitEdit([Windows.Forms.DataGridViewDataErrorContexts]::Commit) #commits the cahnge you are editing
$dataGridView.Rows[$e.RowIndex].Cells | ? {$_.GetType().Name -eq 'DataGridViewCheckBoxCell' } | %{
$_.Value = $ChkSelectAll.Value
}
})
$form.Controls.Add($dataGridView)
$form.ShowDialog()
我在创建 "SelectAll" 复选框列时遇到问题,该列实际上选择了 ROW 中的所有复选框,而不是列中的所有复选框。 "SelectALL" 列是 table 中的第三列,我想在同一行中选中它之后的所有框。 "SelectALL" 列之后的列名是动态生成的,因此在 table 生成之前列名是未知的。到目前为止,这是我的代码:
$CheckAll_click = {
for($i=0;$i -lt $DGV1.RowCount;$i++){
if($DGV1.Rows[$i].Cells['SelectAll'].Value -eq $true) {
for($j=3;$j -le $DGV1.ColumnCount;$j++){
($DGV1.Rows[$i].Cells | ?{$_.ColumnIndex -eq $j}).Value=$true
}
}
else {
for($j=3;$j -le $DGV1.ColumnCount;$j++){
($DGV1.Rows[$i].Cells | ?{$_.ColumnIndex -eq $j}).Value=$false
}
}
}
这比我预期的要难。诀窍(来自 here)是在尝试读取 SelectAll 复选框的状态之前触发 CommitEdit
。 $Sender
和 $EventArgs
(为了便于阅读,在下面缩写为 $e
)在您尝试找出选中了哪个复选框时可能是有用的参数。
@("System.Windows.Forms","System.Drawing") | %{[reflection.assembly]::LoadWithPartialName($_) | Out-Null}
$form = New-Object System.Windows.Forms.Form -Property @{Size=New-Object System.Drawing.Size(900,600)}
$dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{Anchor = "Left,Right,Top,Bottom";Size='870,550'}
@('SelectAll','Col1','Col2') | %{
$dataGridView.columns.Add( (New-Object Windows.Forms.DataGridViewCheckBoxColumn -Property @{Name=$_; TrueValue=$true; FalseValue=$false})) | Out-Null
}
1..4 | %{
$dataGridView.Rows.Add((New-Object System.Windows.Forms.DataGridViewRow)) | Out-Null
}
$dataGridView.add_CellContentClick({param($sender,$e)
if($dataGridView.Rows[$e.RowIndex].Cells[$e.ColumnIndex].OwningColumn.HeaderText -ne 'SelectAll'){return}
[Windows.Forms.DataGridViewCheckBoxCell] $ChkSelectAll = $dataGridView.Rows[$e.RowIndex].Cells |
?{$_.OwningColumn.HeaderText -eq 'SelectAll'}
$dataGridView.CommitEdit([Windows.Forms.DataGridViewDataErrorContexts]::Commit) #commits the cahnge you are editing
$dataGridView.Rows[$e.RowIndex].Cells | ? {$_.GetType().Name -eq 'DataGridViewCheckBoxCell' } | %{
$_.Value = $ChkSelectAll.Value
}
})
$form.Controls.Add($dataGridView)
$form.ShowDialog()