在mouse_click事件中选择DataGridView中的行

Leo*_*ett 3 c# datagridview onclick

我有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          
   }
}
Run Code Online (Sandbox Code Playgroud)

我这样试过:

 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));                
       }
    }        
Run Code Online (Sandbox Code Playgroud)

W0l*_*0ds 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;
    }
Run Code Online (Sandbox Code Playgroud)


Leo*_*ett 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));

            }
        }
Run Code Online (Sandbox Code Playgroud)