.net DataGridView鼠标选择

.net DataGridView鼠标选择,.net,winforms,datagridview,.net,Winforms,Datagridview,我正在Windows窗体应用程序中使用DataGridView控件。当用户按住control键选择多个项目时,效果良好。现在,当用户释放控件并单击(并按住鼠标左键)开始拖动操作时,选择将更改。当用户按住鼠标左键时,如何停止清除选择?好问题。虽然这可能不像你希望的那么简单,但它应该能让你对如何着手解决问题有一些很好的了解: 我在一本书中找到了这个答案 要拖放多行,请将DataGridView.MultiSelect设置为true,并在DataGridView.DragDrop事件中,删除并插入Da

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

好问题。虽然这可能不像你希望的那么简单,但它应该能让你对如何着手解决问题有一些很好的了解:

我在一本书中找到了这个答案

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

这还显示了如何在DataGridView上实现拖放


但在我看来,您必须继承DataGridView并覆盖这些鼠标事件,因为选择更改总是被调用

  • 受保护的虚拟空间 OnCellMouseDown(DataGridViewCellMouseEventArgs e) )
  • 受保护的虚拟空间 OnCellMouseUp(DataGridViewCellMouseEventArgs e) )
然后,您可以在OnMouseDown中截取SelectionChanged事件,并在OnMouseUp中进行选择。您必须保持向下的位置点,以便在不是拖放的情况下选择正确的项目

您还必须在“鼠标下移”事件中维护选定行的列表,如果该列表变成拖放事件,您可以拖动所有这些选定行并在鼠标上选择它们


不要忘记在鼠标向上移动事件中清除选定行的列表/副本。

我发现了一种有效的技术。选择最后一个单元格(使用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;
   }
private SC.ArrayList selectedCells()
{
SC.ArrayList cellsList=新的SC.ArrayList();
Int32 selectedCellCount=dataViewImages.GetCellCount(DataGridViewElementState.Selected);
如果(selectedCellCount>0)
{
对于(int i=0;i
我昨天看到了那篇文章……我希望选择将发生在“单击”而不是“鼠标按下”期间。我已经实现了拖放功能,但我只是想修复它,这样用户在拖动前选择最后一项时就不必按住鼠标键。。。