主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.
拖动的对象需要从这两个事件的参数中获取,及从e中获得.
///先要把接受拖放功能的控件的AllowDrop功能打开.
this.textBox2.AllowDrop = true; this.textBox2.Multiline = true;
private void textBox2_DragDrop(object sender, DragEventArgs e) { ///创建一个数组类,用于保存拖动进来的数据组,这里是文件名路径的数组(多个文件拖进来的情况) ///e.Data.GetData方法就是获取文件名数组的功能,参数是决定关联哪种数据格式. ///这里运用了把 Object 强制转换为 Array 的特点. Array aryFiles = ((System.Array)e.Data.GetData(DataFormats.FileDrop)); for (int i = 0; i < aryFiles.Length; i++) { ///通过For循环把所有文件路径加到字符串label4.text里面. label4.Text = aryFiles.GetValue(i).ToString();// +Environment.NewLine; } path = label4.Text; } private void textBox2_DragEnter(object sender, DragEventArgs e) { ///拖进来时,判断拖动的数据是否是指定数据格式,并设置e.Effect的图标样式. if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.None; //这里说明一下,e传进来的数据,我个人觉得应用这样判断,因为其原理是:应该用e.AllowedEffect.ToString()来判断总共源(发起方)支持哪些拖放操作. //如果发起方支持多种拖放操作时,用上面的判断就要注意选择结果的唯一性.否则前面的拖放样式就很可能由于本发起方有多种拖放操作及满足MOVE又满足 //LINK而又去选择后面代码中的拖放效果,从而使其前面代码应该拥有的脱发效果失效,最终不能实现拖放操作. /* 比较清晰的判断方式可以用下面这种判断方法: if (e.AllowedEffect.ToString().Contains("Copy") && !e.AllowedEffect.ToString().Contains("Link")) e.Effect = DragDropEffects.Copy; if (e.AllowedEffect.ToString() == "Link") e.Effect = DragDropEffects.Link; */ }