我在 Windows 窗体应用程序中使用 DataGridView 控件。当用户按住控件选择多个项目时,它可以正常工作。现在,当用户释放控制并单击(并按住鼠标左键)开始拖动操作时,选择会发生变化。当用户按住鼠标左键时,如何停止清除选择?
3 回答
我在Microsoft 论坛中找到了这个答案
“为了拖放多行,请将 DataGridView.MultiSelect 设置为 true,并在 DataGridView.DragDrop 事件中,删除并插入 DataGridView.SelectedRows 集合中的所有行。”
这篇博文还展示了如何在 DataGridView 上实现拖放
但在我看来,您将不得不从 DataGridView 继承并覆盖这些鼠标事件,因为否则总是会调用选择更改。
- 受保护的虚拟 void OnCellMouseDown(DataGridViewCellMouseEventArgs e);
- 受保护的虚拟 void OnCellMouseUp(DataGridViewCellMouseEventArgs e);
然后您可以拦截 OnMouseDown 中的 SelectionChanged 事件,并改为在 OnMouseUp 中进行选择。您必须保留向下位置点,以便在不是拖放的情况下选择正确的项目。
您还必须在鼠标按下事件中维护选定行的列表,如果它变成拖放事件,则拖动所有这些选定行并在鼠标上选择它们。
并且不要忘记在鼠标向上事件中清除所选行的列表/副本。
好问题。尽管这可能不像您希望的那样简单,但它应该让您对如何解决您的问题有一些很好的了解:http: //www.codeproject.com/KB/cpp/DataGridView_Drag- n-Drop.aspx
我发现了一种有效的技术。选择最后一个单元格(使用 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;
}