在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.
首先设置textbox的 AllowDrop 属性为 True;
然后可以看下上面有关的4个拖拽有关的事件,其中有用的是 DragEnter(拖拽进入时刻) 和 DragDrop(拖拽成功执行时),其他两个都有注释,大家之际写代码仔细观察下。
实现方式代码中都有详细注释,在DragEnter中我们只需要判断是否为
e.Data.GetDataPresent(DataFormats.FileDrop)
其他的if都是我测试的。