【问题标题】:Drag and Drop not working in C# Winforms Application拖放在 C# Winforms 应用程序中不起作用
【发布时间】:2014-12-25 01:08:37
【问题描述】:

我正在尝试创建一个可以将文件/文件夹拖放到其上的 Windows 窗体。

我在 WinForms 应用程序中有以下代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        Debug.Print("DragEnter");
    }

    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        MessageBox.Show("Dropped!");
    }
}

我已将 AllowDrop 属性设置为 true。 我尝试在 Visual Studio 中调试运行应用程序。 根据对其他类似问题的回答,我尝试以管理员身份运行编译后的 exe。 我试过以管理员身份运行编译的 exe not

但无论我做什么,我都无法触发 DragDrop 事件。但是,DragEnter 事件确实 会触发。我错过了什么?

【问题讨论】:

  • 您是否检查过您是否意外丢失了 DragDrop 事件和 Form1_DragDrop 处理程序之间的连接?对不起,如果你这样做了。
  • 是普通表单,还是添加了控件?如果您拖放到表单的控件上,则该控件将负责。
  • 如果您以管理员身份运行 Visual Studio/您的应用程序并且 Windows 资源管理器在您的普通帐户下运行,则拖放将不起作用。
  • @Archlight -- 有谁知道为什么会存在这样的荒谬之处?
  • 安全。它曾经是 COM 通信封装的,所以它看起来像 Win32 api,如果允许在盒子上运行的一个用户访问另一个用户的内存,那将是一个坏主意......今天的情况可能相同。

标签: c# winforms drag-and-drop


【解决方案1】:

您的DragDropEffect 设置是否正确?尝试将它放在 DragEnter 事件处理方法中:

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        Console.WriteLine("DragEnter!");
        e.Effect = DragDropEffects.Copy;
    }

默认设置为DragDropEffects.None,因此 Drop 事件不会触发。

【讨论】:

  • 天哪,谢谢先生/女士!我一直在寻找这个 fo 这么久,但我无法在任何地方找到它。
【解决方案2】:

对于那些会因为上面的提示不起作用而阅读本文的人。

请注意,如果您运行 Visual Studio 或您的应用程序“以管理员身份”运行,则拖放将不起作用,如下所述:https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/2164233-fix-drag-and-drop-to-open-file-when-running-as-adm

【讨论】:

  • 这似乎是指拖放 在 Visual Studio 中 本身,而不是在 Visual Studio 中运行的应用程序。还是我错过了什么?
  • 确实如此。但这仍然是我的问题。我无法在 VS.Net 中以调试模式启动的 WinForm 应用程序上拖放文件,如果这个应用程序以管理员身份运行...
  • 感激不尽。我在这上面浪费了很多时间。
  • 这个答案被低估了。使用管理员权限从 VS 调试将不起作用,但如果您通过文件资源管理器从 /bin/debug 文件夹运行程序,您会注意到拖放工作正常。
【解决方案3】:

不要忘记在表单的属性中将 AllowDrop 更改为“True” 您的代码可能没问题,但如果此属性未启用为 true,它将无法工作。默认设置为false。

【讨论】:

  • AllowDrop 设置为 True。接受的答案是正确的。
  • 在运行时更改 AllowDrop 是否重要
【解决方案4】:

尝试在 Form1_DragEnter 中使用类似的东西:

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
        e.Effect = DragDropEffects.All;
    else
    {
        String[] strGetFormats = e.Data.GetFormats();
        e.Effect = DragDropEffects.None;
    }
}

这会触发你的 Form1_DragDrop

【讨论】:

    【解决方案5】:

    您是否编写了拖动对象的 MouseDown 和 MouseMove 事件。

    【讨论】:

    • 不太清楚为什么这被否决了。我使用这种方法并且效果很好。 if (e.LeftButton == MouseButtonState.Pressed) { DragDrop.DoDragDrop(this.dragItem, this.dragItem, DragDropEffects.Copy);在鼠标移动时,我只需将 e.Handled 设置为 true,使用一个名为 is dragging 的布尔值来检测事件触发时用户是否仍在移动项目。每个要放置的区域都有自己的事件,用于处理放置在哪里的内容。
    【解决方案6】:

    另一个非常讨厌和棘手的问题可能是您覆盖了OnHandleCreated,但忘记调用基本实现。然后您的应用程序无法设置所需的内部窗口设置以尊重您的AllowDrop 属性。

    例如,确保在您的覆盖中调用base.OnHandleCreated(e),您会没事的。

    【讨论】:

      【解决方案7】:

      尽管表单将 AllowDrop 设置为 true,但我也遇到了这个令人困惑的问题!

      在我的 Windows 窗体应用程序 (VS2017) 中,我必须确保设置了一个有效的启动对象:例如 myprojectname.Program,一切都很好!

      【讨论】:

        【解决方案8】:

        我有一个指定的命令行指向一个不再存在的文件。不知何故,这阻止了阻力进入发射。一旦我删除它,一切都很好了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-06
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 1970-01-01
          相关资源
          最近更新 更多