C#拖放,在mouse_down中开始拖动操作?与单击冲突

本文关键字:操作 拖动 冲突 单击 开始 拖放 mouse down | 更新日期: 2023-09-27 18:19:31

我有一个C#WinForms应用程序,它在Form上有一个GridView,它显示数据库中的记录,其中包含存储在数据库中的Blob(文件PDF/JPG/等)。

我可以双击网格中的一行,将blob写入磁盘并打开文件。我可以单击行来选择一行或多行(使用ctrl+shift)我可以将文件拖到网格上,将文件作为行添加到网格(和数据库)中

现在,我希望用户能够将一行或多行从网格拖动到桌面或邮件客户端,但无法确定在什么情况下启动"拖动"操作。

当用户使用鼠标左键选择一个或多个文件时,拖动使用相同的鼠标左键,两个事件都会触发鼠标向下事件。如何确定用户要做什么?

我尝试过在鼠标按下事件中启动拖动操作,但如果我想选择多行,那就不起作用了,每次单击一行都会启动拖动操作。。。

例如,在windows资源管理器中是如何处理的?如何检测用户试图做什么?

C#拖放,在mouse_down中开始拖动操作?与单击冲突

我现在已经开始工作了。然而,我并没有按照建议使用计时器。

在Mouse Down中,我设置了一个标志并存储X,Y点,然后在Mouse up中,我重置了标志,在Mouse move中,我根据存储的X,Y值计算移动,当X或Y方向的移动超过10个像素时,我开始拖动操作。

这是代码。

'

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

'

我也遇到过类似的问题,在表单中添加拖动会干扰现有的双击功能。我找到了一个非常简单的解决方案:

void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (e.Clicks != 2)
    {
        StartDragging();
    }
}

如果双击,则取消拖动,以便继续进行双击。

有不止一种方法可以做到这一点。我强烈建议你尝试其中的一些,直到你决定什么对你最好。例如,您可以使用mousedown事件通过使用计时器来启动拖放。如果用户单击鼠标超过0.5秒,则开始拖动。mouseup事件终止了拖放操作。另一种方法是在单击鼠标时只需按下某个键即可进行拖放。