Selecting and highlight a DataGridView row by checking a checkbox

4.8k views Asked by At
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "testform"
$Form.Size = New-Object System.Drawing.Size(250,300)
$Form.StartPosition = "Centerscreen"

$button = New-Object System.Windows.Forms.Button
$button.Location = New-Object System.Drawing.Size(50,100)
$button.Size = New-Object System.Drawing.Size(140,30)
$button.Text = "Click Here"
$button.Add_Click({[void] $form1.ShowDialog()})
$Form.controls.Add($button)

$form1 = New-Object System.Windows.Forms.Form
$form1.Size = New-Object System.Drawing.Size(500,600)
$Form1.Text = "Select row by checking checkbox test"
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Size=New-Object System.Drawing.Size(400,500)

$form1.Controls.Add($dataGridView)
$dataGridView.ColumnCount = 2
$dataGridView.ColumnHeadersVisible = $true
$dataGridView.Columns.Insert(0, (New-Object System.Windows.Forms.DataGridViewCheckBoxColumn))
$dataGridView.Columns[0].Name = "select"
$dataGridView.Columns[1].Name = "column1"
$dataGridView.Columns[2].Name = "column2"


$dataGridView.Rows.Add($null, "test", "test2")
$dataGridView.Rows.Add($null, "test3", "test4")

$dataGridView.AllowUserToAddRows = $false
$dataGridView.AllowUserToDeleteRows = $false
$dataGridView.Columns["column1"].ReadOnly = $true
$dataGridView.Columns["column2"].ReadOnly = $true

[void] $Form.ShowDialog()

This simply creates a datagridview with a column of checkboxes, what I want is when a checkbox gets checked, the corresponding row gets selected and highligthed, but I don't know how to accomplish that.

1

There are 1 answers

3
Mathias R. Jessen On BEST ANSWER

To highlight a row, you just need to set the Selected property to $true:

$dataGridView.Rows[$n].Selected = $true

To do it when a checkbox is checked, we'll need to add some code to handle the selection when a corresponding event occurs.

According to the documentation for the DataGridView.CellClick event (emphasis added):

For clicks in a DataGridViewCheckBoxCell, this event occurs before the check box changes value, so if you do not want to calculate the expected value based on the current value, you will typically handle the DataGridView.CellValueChanged event instead. Because that event occurs only when the user-specified value is committed, which typically occurs when focus leaves the cell, you must also handle the DataGridView.CurrentCellDirtyStateChanged event. In that handler, if the current cell is a check box cell, call the DataGridView.CommitEdit method and pass in the Commit value.

So, we can simply adapt the example from the documentation page for the DataGridView.CurrentCellDirtyStateChanged event:

$dataGridView.Add_CurrentCellDirtyStateChanged({
    param($Sender,$EventArgs)

    if($Sender.IsCurrentCellDirty){
        $Sender.CommitEdit([System.Windows.Forms.DataGridViewDataErrorContexts]::Commit)
    }
})

$dataGridView.Add_CellValueChanged({
    param($Sender,$EventArgs)

    if($EventArgs.ColumnIndex -eq 0){
        $Sender.Rows[$EventArgs.RowIndex].Selected = [bool]$Sender.Rows[$EventArgs.RowIndex].Cells[$EventArgs.ColumnIndex].Value
    }
})

If you want to keep multiple rows Selected, loop over each row instead:

$dataGridView.Add_CellValueChanged({
    param($Sender,$EventArgs)

    if($EventArgs.ColumnIndex -eq 0){
        foreach($RowIndex in 0..($Sender.Rows.Count - 1)){
            $Sender.Rows[$RowIndex].Selected = [bool]$Sender.Rows[$RowIndex].Cells[$EventArgs.ColumnIndex].Value
        }
    }
})

$dataGridView.MultiSelect   = $true
$dataGridView.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect

enter image description here