文件拖放在列表框上不起作用

Posted

技术标签:

【中文标题】文件拖放在列表框上不起作用【英文标题】:File drag and drop not working on listbox 【发布时间】:2015-01-27 06:27:03 【问题描述】:

这是我第一次使用拖放。所以我有一个带有listbox 的表格,没有别的。我希望能够将文件从桌面或 Windows 资源管理器拖放到我的列表框中。这是我的代码。缺少什么?

表格:

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

        private void listBox1_DragEnter(object sender, DragEventArgs e)
        
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.All;
            else
                e.Effect = DragDropEffects.None;
        


        private void listBox1_DragDrop(object sender, DragEventArgs e)
        
            string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            int i;
            for (i = 0; i < s.Length; i++)
                listBox1.Items.Add(s[i]);
        
    

Form1.Designer.cs:(初始化组件)

private void InitializeComponent()

    this.listBox1 = new System.Windows.Forms.ListBox();
    this.SuspendLayout();
    // 
    // listBox1
    // 
    this.listBox1.AllowDrop = true;
    this.listBox1.FormattingEnabled = true;
    this.listBox1.Location = new System.Drawing.Point(30, 23);
    this.listBox1.Name = "listBox1";
    this.listBox1.Size = new System.Drawing.Size(376, 238);
    this.listBox1.TabIndex = 0;
    this.listBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.listBox1_DragDrop);
    this.listBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.listBox1_DragEnter);
    this.listBox1.DragOver += new System.Windows.Forms.DragEventHandler(this.listBox1_DragOver);
    // 
    // Form1
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(438, 366);
    this.Controls.Add(this.listBox1);
    this.Name = "Form1";
    this.Text = "Form1";
    this.ResumeLayout(false);

【问题讨论】:

你在 DragOver 事件中有什么? 具体说明你想要的效果,只有 DragDropEffects.Copy 有意义。并删除 DragOver 事件处理程序。 @HansPassant 我希望将文件名添加到我的列表框中。我还删除了DragOverevent 处理程序。 好吧,调试器告诉你什么?如果您根本没有收到 DragEnter 事件,那么您需要在没有提升的情况下运行 Visual Studio。 Windows 不允许从非提升应用拖放到提升应用。 UIPI 禁止它,这是 UAC 鲜为人知的方面。 【参考方案1】:

我做了这个,我认为这没问题。不需要 DragOver。

    private void listBox_DragEnter(object sender, DragEventArgs e)
    
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
            e.Effect = DragDropEffects.All;
        else
            e.Effect = DragDropEffects.None;
    

    private void listBox_DragDrop(object sender, DragEventArgs e)
    
        if (listBox.Items.Count != 0)
        
            listBox.Items.Clear();
        
        string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
        int i;
        for (i = 0; i < s.Length; i++)
            listBox.Items.Add(Path.GetFileName(s[i]));
    

【讨论】:

什么都没有改变。当我将文件拖入listbox 时,我仍然会看到“不允许”图标。 我的表单是否也应该将其AllowDrop 选项设置为true AllowDrop 是真的。我发现了一件事,像回收站这样的图标做不到。 检查这个.. :) dropbox.com/s/0nhcn9zk4oydpo4/WindowsFormsApplication1.zip?dl=0 我不这么认为,但我不确定。

以上是关于文件拖放在列表框上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 拖放在 IE11 上不起作用

muuri拖放在Safari Mac上不起作用

自动雅虎邮件登录时,密码编辑框上的发送密钥命令不起作用

拖放在 C# 中不起作用

拖放在 Xcode 中不起作用

拖放在 C# Winforms 应用程序中不起作用