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()