在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)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.Effect = DragDropEffects.Copy;
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e.Effect = DragDropEffects.None;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
- 步骤4 为ListView 添加 DragDrop 事件
DragDrop 事件在这里完成将其他应用程序拖入的文件拷贝到Winform应用当前的目录中。
private void listViewFolder_DragDrop(object sender, DragEventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
String[] files = e.Data.GetData(DataFormats.FileDrop, false) as String[];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//Copy file from external application
foreach (string srcfile in files)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string destFile = labelCurFolder.Text + "\\" + System.IO.Path.GetFileName(srcfile);
if (System.IO.File.Exists(destFile))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
continue;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
System.IO.File.Copy(srcfile, destFile, true);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//List current folder
ListFolder();
}
catch (Exception e1)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (e.Button == MouseButtons.Left)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (listViewFolder.SelectedItems.Count <= 0)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//put selected files into a string array
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string[] files = new String[listViewFolder.SelectedItems.Count];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int i = 0;
foreach (ListViewItem item in listViewFolder.SelectedItems)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
files[i++] = item.Tag.ToString();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//create a dataobject holding this array as a filedrop
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DataObject data = new DataObject(DataFormats.FileDrop, files);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//also add the selection as textdata
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
data.SetData(DataFormats.StringFormat, files[0]);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//Do DragDrop
DoDragDrop(data, DragDropEffects.Copy);
}
}
}
完成了步骤5,拖出功能也实现了。
下面是完整代码下载地址
源代码下载
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步