【问题标题】:Select row in DataGridView in mouse_click event在 mouse_click 事件中选择 DataGridView 中的行
【发布时间】:2013-06-16 08:03:01
【问题描述】:

我在表单上有一个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.X 和e.Y。您可能需要将坐标转换为网格空间,但这很简单。
  • 这应该可以帮助你:stackoverflow.com/questions/1718389/…
  • 我搞定了。上面编辑的帖子包括答案...
  • @LeonidasFett 您可以在页面下方回答您自己的问题。人们可以在那里投票,而且更容易找到

标签: c# datagridview onclick


【解决方案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】:

    您可以使用 grdSchedules_MouseDown 或 grdSchedules_MouseUp 事件而不是 grdSchedules_MouseClick 或 grdSchedules_CellClick。

    【讨论】:

      【解决方案3】:

      我创建了一个更简单、更快速的通用方法,它适用于任何数据网格。此方法允许通过右键单击选择行。将此方法添加到 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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        相关资源
        最近更新 更多