4

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

4

3 回答 3

3

我在Microsoft 论坛中找到了这个答案

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

这篇博文还展示了如何在 DataGridView 上实现拖放


但在我看来,您将不得不从 DataGridView 继承并覆盖这些鼠标事件,因为否则总是会调用选择更改。

  • 受保护的虚拟 void OnCellMouseDown(DataGridViewCellMouseEventArgs e);
  • 受保护的虚拟 void OnCellMouseUp(DataGridViewCellMouseEventArgs e);

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

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

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

于 2008-10-12T03:58:02.760 回答
1

好问题。尽管这可能不像您希望的那样简单,但它应该让您对如何解决您的问题有一些很好的了解:http: //www.codeproject.com/KB/cpp/DataGridView_Drag- n-Drop.aspx

于 2008-10-10T00:32:09.773 回答
0

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

   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;
   }
于 2012-08-03T17:06:32.723 回答