1

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

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

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

当用户选择一个或多个文件时,他/她使用鼠标左键执行此操作,拖动使用相同的鼠标左键,这两个事件都会触发鼠标按下事件。如何确定用户将要做什么?

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

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

4

3 回答 3

8

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

在 Mouse-Down 我设置一个标志并存储 X,Y 点,然后在 mouse-up 我重置标志并在 Mouse-move 我根据存储的 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);
    }

'

于 2013-06-25T09:15:06.813 回答
1

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

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

如果有双击,这将取消拖动,以便双击继续工作。

于 2018-11-12T19:54:05.263 回答
0

有不止一种方法可以做到这一点。我强烈建议您尝试其中的一些,直到您决定什么最适合您。例如,您可以使用 mouse_down 事件通过计时器开始拖放。如果用户单击鼠标超过 0.5 秒,则开始拖动。mouse_up 事件终止拖放。另一种方法是仅在单击鼠标时按下某个键进行拖放。

于 2013-06-24T05:47:12.347 回答