将文件拖放到文本框中

mic*_*lle 21 c#

我想拖放一个文件,以便文本框显示完整的文件路径.我使用了拖动输入和拖放事件,但我发现它们没有进入事件.

private void sslCertField_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
    {
        e.Effect = DragDropEffects.All;
    } 
}

private void sslCertField_DragEnter(object sender, DragEventArgs e)
{
    string file = (string)e.Data.GetData(DataFormats.FileDrop);
    serverURLField.Text = file;
}
Run Code Online (Sandbox Code Playgroud)

谁能指出我做错了什么?

更新:如果程序设置为以提升的权限运行(vista/win 7),则不起作用

max*_*max 22

检查AllowDrop文本框的属性 - 应将其设置为true.此外,将拖放数据转换为以下string[]情况DataFormats.FileDrop,而不仅仅是string:

string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if(files != null && files.Length != 0)
{
    serverURLField.Text = files[0];
}
Run Code Online (Sandbox Code Playgroud)

而且我认为你应该在你的拖动事件处理程序中交换代码 - 通常你会向用户显示拖放是可能的DragEnter并执行实际操作DragDrop.

  • 事实上,当我尝试拖动文件时,我得到了被拒绝的图标 (2认同)
  • 您的应用程序是否在Win7/Vista上以提升(管理员)权限运行?在这种情况下,从资源管理器拖放将无法正常工作. (2认同)

Joa*_*lho 11

提升的特权不应该与它有任何关系.DragOver除了DragDropMax回答之外,您还需要实现该事件.这是应该为DragDrop添加的代码:

private void textBoxFile_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; }

  • 在Windows窗体应用程序中,需要执行以下操作才能使其工作:1)设置`TextBox.AllowDrop = true;`2)使用max的代码处理`TextBox.DragDrop()`事件3)同时处理`TextBox .DragOver()`事件使用上面的Joao代码.当满足所有3个条件时,它应该工作.在我的情况下,不需要"提升的priveleges",但如果您发现它是一个问题,您可以随时将Visual Studio快捷方式更改为"以管理员身份运行". (4认同)

小智 5

不要从visual studio运行它...运行一旦你构建你的解决方案就创建的.exe ...希望有帮助:)


Mic*_* V. 5

如果您正在使用 WPF 并且它仍然无法与此处的答案一起使用(这是我的情况),您需要使用

e.Handled = true;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如此此处PreviewDragEnter所述(它们是同一篇文章,但以防万一发生故障)。

这是来自该来源的代码片段:

private void TextBox_PreviewDragEnter(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.Copy;
    e.Handled = true;
}

private void TextBox_PreviewDrop(object sender, DragEventArgs e)
{
    object text = e.Data.GetData(DataFormats.FileDrop);
    TextBox tb = sender as TextBox;
    if (tb != null)
    {
        tb.Text = string.Format("{0}", ((string[])text)[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)