DataGridView鼠标选择

时间:2008-10-09 17:39:25

标签: .net winforms datagridview

我在Windows窗体应用程序中使用DataGridView控件。当用户按住控件以选择多个项目时,它可以正常工作。现在,当用户释放控件并单击(并按住鼠标左键)以开始拖动操作时,选择会更改。当用户按住鼠标左键时,如何停止选择清除?

3 个答案:

答案 0 :(得分:3)

我在Microsoft Forum

中找到了这个答案

“为了拖放多行,将DataGridView.MultiSelect设置为true,并在DataGridView.DragDrop事件中,删除并插入DataGridView.SelectedRows集合中的所有行。”

这个blog entry还展示了如何在DataGridView上实现拖放


但在我看来,你必须从DataGridView继承并覆盖这些鼠标事件,否则将始终调用选择更改。

  • protected virtual void OnCellMouseDown(DataGridViewCellMouseEventArgs E);
  • protected virtual void OnCellMouseUp(DataGridViewCellMouseEventArgs E);

然后,您可以拦截OnMouseDown中的SelectionChanged事件,并在OnMouseUp中进行选择。您必须保留向下位置点,以便在不是拖放时选择正确的项目。

您还必须在鼠标按下事件中维护所选行的列表,如果它变为拖放事件,则拖动所有这些选定行并在鼠标上选择它们。

不要忘记清除鼠标注册事件中所选行的列表/副本。

答案 1 :(得分:1)

好问题。虽然这可能不像您希望的那样简单,但它应该为您提供一些有关如何解决问题的良好见解: http://www.codeproject.com/KB/cpp/DataGridView_Drag-n-Drop.aspx

答案 2 :(得分:0)

我找到了一种有效的技术。选择最后一个单元格(使用ctrl或shift)后,在释放鼠标按钮之前开始拖动,选择不会改变。然后在下拉列表中,您可以使用以下方法获取所选单元格的列表:

   private SC.ArrayList selectedCells()
   {
      SC.ArrayList cellsList = new SC.ArrayList();
      Int32 selectedCellCount = dataViewImages.GetCellCount(DataGridViewElementStates.Selected);
      if (selectedCellCount > 0)
      {
         for (int i = 0;i < selectedCellCount; i++) {
            int cell = dataViewImages.SelectedCells[i].RowIndex*ShowImages.NumColumnsForWidth() + dataViewImages.SelectedCells[i].ColumnIndex;
            cellsList.Add(cell);
         }
         cellsList.Sort();
         return cellsList;
      }
      else
         return null;
   }