在 mouse_click 事件中选择 DataGridView 中的行

7
我在一个表单上有一个 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));                
       }
    }        

你可以在CellClick事件中使用MousePosition代替e.Xe.Y。你可能需要将坐标转换为网格空间,但这很简单。 - DonBoitnott
这应该会对你有所帮助:https://dev59.com/VnI-5IYBdhLWcg3wtaxq - computer10171
我已经解决了。编辑了上面的帖子以包括答案... - LeonidasFett
@LeonidasFett,您可以在页面下方回答自己的问题。那里的人们可以投票,而且更容易找到。 - cgalvao1993
3个回答

14

我创建了一个更简单、更快速的通用方法,适用于任何数据网格。该方法允许通过右键选择行。将此方法添加到您的DataGridView的“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
我找到了一个解决方案。这是我做的: 。
        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));

            }
        }

0

你本可以使用 grdSchedules_MouseDown 或者 grdSchedules_MouseUp 事件代替 grdSchedules_MouseClick 或者 grdSchedules_CellClick


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接