在C#的Winform中实现文件拖拽得到文件名,可以根据不同的文件类型设定鼠标手势。默认情况下不论什么东西拖入控件鼠标手势都是允许的,这并不友好。这里直接用例子说明,不被允许的文件类型都可以显示禁止的鼠标手势。看代码

/// <summary>
/// 是否为我们需要的File类型文件(根据文件后缀)
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private bool isAllow(string path)
{
    //排除文件夹
    if (!File.Exists(path))
        return false;
    //允许的文件后缀
    string[] exts = { ".jpg", ".jpeg", ".gif", ".png", ".bmp" };
    string ext = Path.GetExtension(path).ToLower();
    var list = from a in exts
                where a == ext
                select a;
    return list.Count<String>() < 1 ? false : true;
}
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    //4、完成拖拽(仅成功时响应)
    ((TextBox)sender).AppendText("dd" + Environment.NewLine);
    string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
    ((TextBox)sender).AppendText(path + Environment.NewLine);
    ((TextBox)sender).SelectionStart = ((TextBox)sender).Text.Length;
    ((TextBox)sender).SelectionLength = 0;
}
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
    //1、最先执行,进入区域
    ((TextBox)sender).AppendText("de" + Environment.NewLine);
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        //确定拖动进来的是文件/文件夹,不是比如:拖拽别的编辑器中的文字图片等
        string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
        if (isAllow(path))
        {
            //很关键,注意
            e.Effect = DragDropEffects.Link;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }
    else if (e.Data.GetDataPresent(typeof(System.String)))
    {
        //string 拖入 禁止
        //((TextBox)sender).AppendText("string data No." + Environment.NewLine);
        //e.Effect = DragDropEffects.None;
    }
    else if (e.Data.GetDataPresent("Text"))
    {
        //e.Effect = DragDropEffects.Copy;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}
private void textBox1_DragLeave(object sender, EventArgs e)
{
    //3、拖动离开区域
    ((TextBox)sender).AppendText("dl" + Environment.NewLine);
}
private void textBox1_DragOver(object sender, DragEventArgs e)
{
    //2、拖动处于区域内时,一直触发
    //((TextBox)sender).AppendText("do" + Environment.NewLine);
}

 界面上就只有一个textBox.

00.jpg

首先设置textbox的 AllowDrop 属性为 True;

然后可以看下上面有关的4个拖拽有关的事件,其中有用的是 DragEnter(拖拽进入时刻)DragDrop(拖拽成功执行时),其他两个都有注释,大家之际写代码仔细观察下。

实现方式代码中都有详细注释,在DragEnter中我们只需要判断是否为

e.Data.GetDataPresent(DataFormats.FileDrop)

其他的if都是我测试的。