c# 实现文件拖入和拖出(拖拽)

摘自:http://www.cnblogs.com/eaglet/archive/2009/01/06/1370149.html

C# WinForm下一步一步实现文件的拖入和拖出

作者:Eaglet

      在WinForm实现一个类似资源浏览器的功能,需要实现将WinForm中列出的文件拖出到其他应用程序中或者从其他应用程序中将文件拖入到Winform应用中。网上有一些文章介绍这种功能,但都比较零散,缺少一个完整的例子。为此我编写了一个较完整的实现文件拖入和拖出的例子,并撰写此文一步步讲解如果实现类似功能。

  •       步骤1 放置一个 ListView 到 Winform窗体中 并初始化如下属性:

            listView.View = View.Details;
            listView.AllowDrop = true;

  •   步骤2 撰写一个目录文件列表显示的函数

c# 实现文件拖入和拖出(拖拽)

c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽) /**//// <summary>
c# 实现文件拖入和拖出(拖拽) /// List files in the folder
c# 实现文件拖入和拖出(拖拽) /// </summary>
c# 实现文件拖入和拖出(拖拽) /// <param name="directory">the directory of the folder</param>
c# 实现文件拖入和拖出(拖拽) private void ListFolder(string directory)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)            labelCurFolder.Text = directory;
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)            String[] fileList = System.IO.Directory.GetFiles(directory);
c# 实现文件拖入和拖出(拖拽)            listViewFolder.Items.Clear();
c# 实现文件拖入和拖出(拖拽)            listViewFolder.Columns.Clear();
c# 实现文件拖入和拖出(拖拽)            listViewFolder.Columns.Add("Name", 300);
c# 实现文件拖入和拖出(拖拽)            listViewFolder.Columns.Add("Size", 100);
c# 实现文件拖入和拖出(拖拽)            listViewFolder.Columns.Add("Time", 200);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) foreach (string fileName in fileList)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) //Show file name
c# 实现文件拖入和拖出(拖拽)                ListViewItem itemName = new ListViewItem(System.IO.Path.GetFileName(fileName));
c# 实现文件拖入和拖出(拖拽)                itemName.Tag = fileName;
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //Show file icon

c# 实现文件拖入和拖出(拖拽)                IconImageProvider iconImageProvider = new IconImageProvider(listViewFolder.SmallImageList,

listViewFolder.LargeImageList);

c# 实现文件拖入和拖出(拖拽)                itemName.ImageIndex = iconImageProvider.GetIconImageIndex(fileName);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //Show file size
c# 实现文件拖入和拖出(拖拽)                System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
c# 实现文件拖入和拖出(拖拽) long size = fileInfo.Length;
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                String strSize;
c# 实现文件拖入和拖出(拖拽) if (size < 1024)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                    strSize = size.ToString();
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽) else if (size < 1024 * 1024)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                    strSize = String.Format("{0:###.##}KB", (float)size / 1024);
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽) else if (size < 1024 * 1024 * 1024)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                    strSize = String.Format("{0:###.##}MB", (float)size / (1024 * 1024));
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽) else
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                    strSize = String.Format("{0:###.##}GB", (float)size / (1024 * 1024 * 1024));
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();
c# 实现文件拖入和拖出(拖拽)                subItem.Text = strSize;
c# 实现文件拖入和拖出(拖拽)                subItem.Tag = size;
c# 实现文件拖入和拖出(拖拽)                itemName.SubItems.Add(subItem);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //Show file time
c# 实现文件拖入和拖出(拖拽)                subItem = new ListViewItem.ListViewSubItem();
c# 实现文件拖入和拖出(拖拽)                DateTime fileTime = System.IO.File.GetLastWriteTime(fileName);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                subItem.Text = (string)fileTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); ;
c# 实现文件拖入和拖出(拖拽)                subItem.Tag = fileTime;
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                itemName.SubItems.Add(subItem);
c# 实现文件拖入和拖出(拖拽)                listViewFolder.Items.Add(itemName);
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽)        }

c# 实现文件拖入和拖出(拖拽)

上面代码中有一段显示图标的代码由于和拖动无关,我就不贴出来了,感兴趣可以下载完整的代码去看。

  •   步骤3 为ListView 添加 DragEnter 事件

  DragEnter 事件在其他应用程序拖入的文件进入时判断当前拖动的对象类型,如果是文件类型,则设置拖动响应类型为Copy.

c# 实现文件拖入和拖出(拖拽)

c# 实现文件拖入和拖出(拖拽) private void listViewFolder_DragEnter(object sender, DragEventArgs e)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) if (e.Data.GetDataPresent(DataFormats.FileDrop))
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                e.Effect = DragDropEffects.Copy;
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽) else
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                e.Effect = DragDropEffects.None;
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)        }

c# 实现文件拖入和拖出(拖拽)

  •   步骤4 为ListView 添加 DragDrop 事件
DragDrop 事件在这里完成将其他应用程序拖入的文件拷贝到Winform应用当前的目录中。

c# 实现文件拖入和拖出(拖拽)

c# 实现文件拖入和拖出(拖拽) private void listViewFolder_DragDrop(object sender, DragEventArgs e)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) try
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                String[] files = e.Data.GetData(DataFormats.FileDrop, false) as String[];
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //Copy file from external application
c# 实现文件拖入和拖出(拖拽) foreach (string srcfile in files)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) string destFile = labelCurFolder.Text + "\\" + System.IO.Path.GetFileName(srcfile);
c# 实现文件拖入和拖出(拖拽) if (System.IO.File.Exists(destFile))
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){

c# 实现文件拖入和拖出(拖拽) 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)),

c# 实现文件拖入和拖出(拖拽) "Confirm File Replace", MessageBoxButtons.YesNo, MessageBoxIcon.None) !=

DialogResult.Yes)

c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){

c# 实现文件拖入和拖出(拖拽) continue;
c# 实现文件拖入和拖出(拖拽)                        }
c# 实现文件拖入和拖出(拖拽)                    }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                    System.IO.File.Copy(srcfile, destFile, true);
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //List current folder
c# 实现文件拖入和拖出(拖拽)                ListFolder();
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽) catch (Exception e1)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                MessageBox.Show(e1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽)        }

c# 实现文件拖入和拖出(拖拽)

  完成上述4步后,拖入功能就实现了。下面步骤完成拖出功能

  •   步骤5 为ListView 添加 ItemDrag 事件

   这个事件在ListView 的Item被拖动时响应,我们利用这个事件将当前选中的item对应的文件名复制到拖动数据中,

并调用窗体的DoDragDrop方法告知窗体现在开始做拖放操作。

c# 实现文件拖入和拖出(拖拽)

c# 实现文件拖入和拖出(拖拽) private void listViewFolder_ItemDrag(object sender, ItemDragEventArgs e)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) if (e.Button == MouseButtons.Left)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) if (listViewFolder.SelectedItems.Count <= 0)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽) return;
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //put selected files into a string array
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) string[] files = new String[listViewFolder.SelectedItems.Count];
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) int i = 0;
c# 实现文件拖入和拖出(拖拽) foreach (ListViewItem item in listViewFolder.SelectedItems)
c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽)c# 实现文件拖入和拖出(拖拽){
c# 实现文件拖入和拖出(拖拽)                    files[i++] = item.Tag.ToString();
c# 实现文件拖入和拖出(拖拽)                }
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //create a dataobject holding this array as a filedrop
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                DataObject data = new DataObject(DataFormats.FileDrop, files);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //also add the selection as textdata
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽)                data.SetData(DataFormats.StringFormat, files[0]);
c# 实现文件拖入和拖出(拖拽)
c# 实现文件拖入和拖出(拖拽) //Do DragDrop
c# 实现文件拖入和拖出(拖拽)                DoDragDrop(data, DragDropEffects.Copy);
c# 实现文件拖入和拖出(拖拽)            }
c# 实现文件拖入和拖出(拖拽)        }
c# 实现文件拖入和拖出(拖拽)    }

c# 实现文件拖入和拖出(拖拽)

c# 实现文件拖入和拖出(拖拽)

上一篇:Memory Allocation API In Linux Kernel && Linux Userspace、kmalloc vmalloc Difference、Kernel Large Section Memory Allocation


下一篇:数据治理实践:元数据管理架构的演变