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



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

     作者:Eaglet

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

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

                listView.View = View.Details;
                listView.AllowDrop 
    = true;
    •   步骤2 撰写一个目录文件列表显示的函数
            /// <summary>
            
    /// List files in the folder
            
    /// </summary>
            
    /// <param name="directory">the directory of the folder</param>

            private void ListFolder(string directory)
            
    {
                labelCurFolder.Text 
    = directory;

                String[] fileList 
    = System.IO.Directory.GetFiles(directory);
                listViewFolder.Items.Clear();
                listViewFolder.Columns.Clear();
                listViewFolder.Columns.Add(
    "Name"300);
                listViewFolder.Columns.Add(
    "Size"100);
                listViewFolder.Columns.Add(
    "Time"200);

                
    foreach (string fileName in fileList)
                
    {
                    
    //Show file name
                    ListViewItem itemName = new ListViewItem(System.IO.Path.GetFileName(fileName));
                    itemName.Tag 
    = fileName;

                    
    //Show file icon

                    IconImageProvider iconImageProvider = new IconImageProvider(listViewFolder.SmallImageList,

     listViewFolder.LargeImageList);

                    itemName.ImageIndex = iconImageProvider.GetIconImageIndex(fileName);

                    
    //Show file size
                    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
                    
    long size = fileInfo.Length;

                    String strSize;
                    
    if (size < 1024)
                    
    {
                        strSize 
    = size.ToString();
                    }

                    
    else if (size < 1024 * 1024)
                    
    {
                        strSize 
    = String.Format("{0:###.##}KB", (float)size / 1024);
                    }

                    
    else if (size < 1024 * 1024 * 1024)
                    
    {
                        strSize 
    = String.Format("{0:###.##}MB", (float)size / (1024 * 1024));
                    }

                    
    else
                    
    {
                        strSize 
    = String.Format("{0:###.##}GB", (float)size / (1024 * 1024 * 1024));
                    }


                    ListViewItem.ListViewSubItem subItem 
    = new ListViewItem.ListViewSubItem();
                    subItem.Text 
    = strSize;
                    subItem.Tag 
    = size;
                    itemName.SubItems.Add(subItem);

                    
    //Show file time
                    subItem = new ListViewItem.ListViewSubItem();
                    DateTime fileTime 
    = System.IO.File.GetLastWriteTime(fileName);

                    subItem.Text 
    = (string)fileTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); ;
                    subItem.Tag 
    = fileTime;

                    itemName.SubItems.Add(subItem);
                    listViewFolder.Items.Add(itemName);
                }

            }

     

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

     

    •    步骤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, falseas 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,拖出功能也实现了。

    下面是完整代码下载地址

    源代码下载 


  • 相关阅读:
    一、CentOS 7安装部署GitLab服务器

    四、指定Nginx启动用户
    三、Nginx支持php
    二、Nginx多站点配置(参考宝塔的)分析
    一、Nginx多站点配置
    一、PHP和Apache实现多用户自助建站
    Flask+uwsgi+Nginx+Ubuntu部署
    flask 上传头像
    flask 分页
  • 原文地址:https://www.cnblogs.com/eaglet/p/1370149.html
Copyright © 2020-2023  润新知