我在表单上有一个DataGridView
。当我右键单击一行时,我需要程序打开上下文菜单。通过此上下文菜单,我希望能够修改DataGridView
中的数据。
我已经获得了上下文菜单以显示我右键点击的位置,但我不知道从哪里开始。因为我将删除(例如)整行,我需要获取所述行的索引并将其设置为选中。我尝试使用cell_clicked
事件但我无法确定是否按下了鼠标左键或右键。但是对于mouse_click
事件,我无法获得行索引。
这是我的代码:
public Form()
{
ContextMenu contextMenu = new ContextMenu();
//Fill Context Menu
MenuItem delete = new MenuItem("Delete");
contextMenu.MenuItems.Add(delete);
}
private void grdSchedules_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
contextMenu.Show(grdSchedules, new Point(e.Y, e.Y));
//Get rowindex here and select row
}
}
我试过这种方式:
private void grdSchedules_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right) //e.Button does not work here
{
contextMenu.Show(grdSchedules, new Point(e.Y, e.Y));
}
}
答案 0 :(得分:8)
我创建了一个更简单,更快速的通用方法,适用于任何数据网格。此方法允许通过右键单击选择行。将此方法添加到DataGridViews' "的MouseDown"事件:
public void DataGridView_RightMouseDown_Select(object sender, MouseEventArgs e)
{
// If the user pressed something else than mouse right click, return
if (e.Button != System.Windows.Forms.MouseButtons.Right) { return; }
DataGridView dgv = (DataGridView)sender;
// Use HitTest to resolve the row under the cursor
int rowIndex = dgv.HitTest(e.X, e.Y).RowIndex;
// If there was no DataGridViewRow under the cursor, return
if (rowIndex == -1) { return; }
// Clear all other selections before making a new selection
dgv.ClearSelection();
// Select the found DataGridViewRow
dgv.Rows[rowIndex].Selected = true;
}
答案 1 :(得分:1)
我找到了解决方案。我是这样做的:
private void grdSchedules_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
int currentMouseOverRow = grdSchedules.HitTest(e.X, e.Y).RowIndex;
for (int x = 0; x < grdSchedules.Rows.Count; x++)
{
if (grdSchedules.Rows[x].Index == currentMouseOverRow)
{
grdSchedules.Rows[x].Selected = true;
}
else
{
grdSchedules.Rows[x].Selected = false;
}
}
contextMenu.Show(grdSchedules, new Point(e.Y, e.Y));
}
}
答案 2 :(得分:0)
您可以使用grdSchedules_MouseDown
或grdSchedules_MouseUp
个事件代替grdSchedules_MouseClick
或grdSchedules_CellClick
。