C#drag n drop,在mouse_down中开始拖动操作?与点击冲突

Jur*_*jen 0 c# drag-and-drop winforms

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

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

现在我希望用户能够将一个或多个行从网格拖到例如桌面或邮件客户端,但无法弄清楚在什么情况下启动"拖动"操作.

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

我已尝试在鼠标按下事件中启动拖动操作,但如果我想选择多行,则每次单击拖动操作开始的行时都不起作用...

例如,在Windows资源管理器中如何处理?如何检测用户尝试做什么?

Jur*_*jen 6

我现在已经开始工作了.但是我没有按照建议使用计时器.

在鼠标向下我设置一个标志并存储X,Y点,然后在鼠标向上我重置标志并在鼠标移动我基于存储的X,Y poiny计算运动,当运动在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);
    }
Run Code Online (Sandbox Code Playgroud)

"