2008-10-09 95 views
4

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

回答

3

我发现这个答案在Microsoft Forum

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

blog entry还展示了如何实现拖动和一个DataGridView


下降,但在我看来,你将不得不从DataGridView中继承并重写这些鼠标事件作为选择的变化总是会得到否则称呼。

  • 保护虚拟无效 OnCellMouseDown(DataGridViewCellMouseEventArgs E);
  • protected virtual void OnCellMouseUp(DataGridViewCellMouseEventArgs e);

然后,您可以拦截OnMouseDown中的SelectionChanged事件,并在OnMouseUp中进行选择。你将不得不保留下来的位置点,这样你可以选择正确的项目,如果它不是一个拖放。

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

并且不要忘记在鼠标向上事件中清除所选行的列表/副本。

1

好问题。虽然这可能不是那么简单,因为你可能一直希望的答案,它应该给你如何去解决你的问题的一些很好的启示: http://www.codeproject.com/KB/cpp/DataGridView_Drag-n-Drop.aspx

+0

我昨天看到那篇文章...我希望在“单击”而不是“鼠标按下”时发生选择, 。我已经实现了拖放功能,但我只是试图修复它,以便用户在拖动之前选择最后一个项目时不必按住鼠标按钮... – joek1975 2008-10-10 14:59:19

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