通过选中复选框选择并突出显示 DataGridView 行
Selecting and highlight a DataGridView row by checking a checkbox
$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()
这只是创建了一个带有一列复选框的数据网格视图,我想要的是当一个复选框被选中时,相应的行被选中并突出显示,但我不知道如何实现。
要突出显示一行,只需将 Selected
属性 设置为 $true:
$dataGridView.Rows[$n].Selected = $true
要在选中复选框时执行此操作,我们需要添加一些代码以在相应事件发生时处理选择。
根据 DataGridView.CellClick
事件的文档(添加了重点):
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.
因此,我们可以简单地改编 DataGridView.CurrentCellDirtyStateChanged
事件文档页面中的示例:
$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
}
})
如果您想保留多行 Selected
,请改为遍历每一行:
$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
$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()
这只是创建了一个带有一列复选框的数据网格视图,我想要的是当一个复选框被选中时,相应的行被选中并突出显示,但我不知道如何实现。
要突出显示一行,只需将 Selected
属性 设置为 $true:
$dataGridView.Rows[$n].Selected = $true
要在选中复选框时执行此操作,我们需要添加一些代码以在相应事件发生时处理选择。
根据 DataGridView.CellClick
事件的文档(添加了重点):
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.
因此,我们可以简单地改编 DataGridView.CurrentCellDirtyStateChanged
事件文档页面中的示例:
$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
}
})
如果您想保留多行 Selected
,请改为遍历每一行:
$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