在WinForm实现一个类似资源浏览器的功能,需要实现将WinForm中列出的文件拖出到其他应用程序中或者从其他应用程序中将文件拖入到 Winform应用中。网上有一些文章介绍这种功能,但都比较零散,缺少一个完整的例子。为此我编写了一个较完整的实现文件拖入和拖出的例子,并撰写此文一步步讲解如果实现类似功能。
C# WinForm下一步一步实现文件的拖入和拖出
作者:Eaglet
在WinForm实现一个类似资源浏览器的功能,需要实现将WinForm中列出的文件拖出到其他应用程序中或者从其他应用程序中将文件拖入到Winform应用中。网上有一些文章介绍这种功能,但都比较零散,缺少一个完整的例子。为此我编写了一个较完整的实现文件拖入和拖出的例子,并撰写此文一步步讲解如果实现类似功能。
- 步骤1 放置一个 ListView 到 Winform窗体中 并初始化如下属性:
listView.View = View.Details;
listView.AllowDrop = true;
上面代码中有一段显示图标的代码由于和拖动无关,我就不贴出来了,感兴趣可以下载完整的代码去看。
- 步骤3 为ListView 添加 DragEnter 事件
DragEnter 事件在其他应用程序拖入的文件进入时判断当前拖动的对象类型,如果是文件类型,则设置拖动响应类型为Copy.
private void listViewFolder_DragEnter(object sender, DragEventArgs e)

{
if (e.Data.GetDataPresent(DataFormats.FileDrop))

{
e.Effect = DragDropEffects.Copy;
}
else

{
e.Effect = DragDropEffects.None;
}

}
- 步骤4 为ListView 添加 DragDrop 事件
DragDrop 事件在这里完成将其他应用程序拖入的文件拷贝到Winform应用当前的目录中。
private void listViewFolder_DragDrop(object sender, DragEventArgs e)

{
try

{
String[] files = e.Data.GetData(DataFormats.FileDrop, false) as String[];

//Copy file from external application
foreach (string srcfile in files)

{
string destFile = labelCurFolder.Text + "\\" + System.IO.Path.GetFileName(srcfile);
if (System.IO.File.Exists(destFile))

{
if (MessageBox.Show(string.Format(
"This folder already contains a file named {0}, would you like to replace the existing file",
System.IO.Path.GetFileName(srcfile)),
"Confirm File Replace", MessageBoxButtons.YesNo, MessageBoxIcon.None) !=
DialogResult.Yes)

{
continue;
}
}

System.IO.File.Copy(srcfile, destFile, true);
}

//List current folder
ListFolder();
}
catch (Exception e1)

{
MessageBox.Show(e1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
完成上述4步后,拖入功能就实现了。下面步骤完成拖出功能
- 步骤5 为ListView 添加 ItemDrag 事件
这个事件在ListView 的Item被拖动时响应,我们利用这个事件将当前选中的item对应的文件名复制到拖动数据中,
并调用窗体的DoDragDrop方法告知窗体现在开始做拖放操作。
private void listViewFolder_ItemDrag(object sender, ItemDragEventArgs e)

{
if (e.Button == MouseButtons.Left)

{
if (listViewFolder.SelectedItems.Count <= 0)

{
return;
}

//put selected files into a string array

string[] files = new String[listViewFolder.SelectedItems.Count];

int i = 0;
foreach (ListViewItem item in listViewFolder.SelectedItems)

{
files[i++] = item.Tag.ToString();
}

//create a dataobject holding this array as a filedrop

DataObject data = new DataObject(DataFormats.FileDrop, files);

//also add the selection as textdata

data.SetData(DataFormats.StringFormat, files[0]);

//Do DragDrop
DoDragDrop(data, DragDropEffects.Copy);
}
}
}
完成了步骤5,拖出功能也实现了。
下面是完整代码下载地址
源代码下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述