我有一个带有GridView的C#WinForms应用程序,它显示了数据库中包含存储在数据库中的blob(文件PDF / JPG /等)的记录。
我可以双击网格中的一行,将blob写入磁盘并打开文件。 我可以单击行来选择一行或多行(使用ctrl + shift) 我可以将文件拖到网格上,将文件作为行添加到网格(和数据库)
现在我希望用户能够将一个或多个行从网格拖到例如桌面或邮件客户端,但无法弄清楚在什么情况下启动“拖动”操作。
当用户使用鼠标左键选择一个或多个文件时,拖动会使用相同的鼠标左键,两个事件都会触发鼠标按下事件。如何确定用户将要做什么?
我已尝试在鼠标按下事件中启动拖动操作,但如果我想选择多行,则无效,每次单击一行拖动操作开始...
例如,如何在Windows资源管理器中处理? 如何检测用户尝试做什么?
答案 0 :(得分:6)
我现在已经开始工作了。但是我没有按照建议使用计时器。
在鼠标按下我设置一个标志并存储X,Y点,然后在鼠标向上我重置标志,在鼠标移动中我根据存储的X,Y poiny计算移动,当移动超过10像素时X或Y方向我开始拖动操作。
这是代码。
private bool DraggingFromGrid = false;
private System.Drawing.Point DraggingStartPoint = new System.Drawing.Point( );
void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
DraggingFromGrid = true;
DraggingStartPoint = new System.Drawing.Point(e.X, e.Y);
}
}
void GridControlBrowser_MouseUp(object sender, MouseEventArgs e)
{
if (DraggingFromGrid)
{
DraggingFromGrid = false;
}
}
void GridControlBrowser_MouseMove(object sender, MouseEventArgs e)
{
if (DraggingFromGrid)
{
if (System.Math.Abs(e.X - DraggingStartPoint.X) > 10 ||
System.Math.Abs(e.Y - DraggingStartPoint.Y) > 10)
{
StartDragging();
}
}
}
private void StartDragging()
{
DraggingFromGrid = false;
// create files
var _criteria = this.GetSelectionFromGrid();
var _files = new List<string>();
... retrieve filenames and store in _files List ...
var _data = new DataObject(DataFormats.FileDrop, _files.ToArray());
DoDragDrop(_data, DragDropEffects.Copy);
}
答案 1 :(得分:0)
有多种方法可以做到这一点。我强烈建议你尝试其中一些,直到你决定什么对你最好。例如,您可以使用mouse_down事件通过使用计时器开始拖放。如果用户点击鼠标超过0.5秒,则开始拖动。 mouse_up事件终止了拖放。 另一种方法是在点击鼠标时按下一些键进行拖放。
答案 2 :(得分:0)
我有一个类似的问题,就是在表单中添加拖动会干扰现有的双击功能。我找到了一个非常简单的解决方案:
void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Clicks != 2)
{
StartDragging();
}
}
如果双击将取消拖动,因此双击将继续起作用。