如何在右键单击时选择 datagridview 行?
8 回答
让它的行为类似于鼠标左键?例如
private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
dataGridView.CurrentCell = dataGridView[e.ColumnIndex, e.RowIndex];
}
}
// Clear all the previously selected rows
foreach (DataGridViewRow row in yourDataGridView.Rows)
{
row.Selected = false;
}
// Get the selected Row
DataGridView.HitTestInfo info = yourDataGridView.HitTest( e.X, e.Y );
// Set as selected
yourDataGridView.Rows[info.RowIndex].Selected = true;
很酷的事情是在右键单击时添加一个菜单,例如“查看客户信息”、“验证最后一张发票”、“向该客户添加日志条目”等选项。
您只需要添加一个 ContextMenuStrip 对象,添加您的菜单项,然后在 DataGridView 属性中选择它的 ContextMenuStrip。
这将在用户右键单击所有选项的行中创建一个新菜单,然后您需要做的就是施展魔法:)
请记住,您需要 JvR 代码来获取用户所在的行,然后抓取包含客户端 ID 的单元格并传递该信息。
希望它有助于改进您的应用程序
子类化DataGridView
并为网格创建一个MouseDown
事件,
private void SubClassedGridView_MouseDown(object sender, MouseEventArgs e)
{
// Sets is so the right-mousedown will select a cell
DataGridView.HitTestInfo hti = this.HitTest(e.X, e.Y);
// Clear all the previously selected rows
this.ClearSelection();
// Set as selected
this.Rows[hti.RowIndex].Selected = true;
}
从@Alan Christensen
代码转换为 VB.NET
Private Sub dgvCustomers_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvCustomers.CellMouseDown
If e.Button = MouseButtons.Right Then
dgvCustomers.CurrentCell = dgvCustomers(e.ColumnIndex, e.RowIndex)
End If
End Sub
我在 VS 2017 上进行了测试,它对我有用!!!
If e.Button = MouseButtons.Right Then
DataGridView1.CurrentCell = DataGridView1(e.ColumnIndex, e.RowIndex)
End If
代码也适用于 VS2019
您可以在 DataGridView 的 MouseDown 事件中使用 JvR 的代码。
你必须做两件事:
清除所有行并选择当前行。我遍历所有行并
i = e.RowIndex
为此使用布尔表达式如果您完成了第 1 步,您仍然有一个很大的陷阱:
DataGridView1.CurrentRow 不会返回您之前选择的行(这很危险)。由于 CurrentRow 是只读的,你必须这样做Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex)
Protected Overrides Sub OnCellMouseDown( ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) MyBase.OnCellMouseDown(e) Select Case e.Button Case Windows.Forms.MouseButtons.Right If Me.Rows(e.RowIndex).Selected = False Then For i As Integer = 0 To Me.RowCount - 1 SetSelectedRowCore(i, i = e.RowIndex) Next End If Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex) End Select End Sub