在鼠标单击事件上选择DataGridView中的行

时间:2013-06-19 17:00:52

标签: 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          
   }
}

我试过这种方式:

 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));                
       }
    }        

3 个答案:

答案 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_MouseDowngrdSchedules_MouseUp个事件代替grdSchedules_MouseClickgrdSchedules_CellClick