C# vs2010winform中ListView的使用

版权所有,禁止匿名转载;禁止商业使用。

 
使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览、重命名、删除及查询等功能,主要功能界面展示如下:

211913260469781.png

211913356565347.png


using System;

 using System.Collections.Generic;

 using System.ComponentModel;

 using System.Data;

 using System.Drawing;

 using System.Linq;

 using System.Text;

 using System.Windows.Forms;

 using System.IO;

 

 namespace Controls

 {

     public partial class MainForm : Form

     {

         #region 成员变量

         /// <summary>

         /// 用于递归计算文件夹大小

         /// </summary>

         private long folderSize = 0;

 

         /// <summary>

         ///打开文件夹根路径

         /// </summary>

         private string rootPath = string.Empty;

         #endregion

 

         #region 初期化

         /// <summary>

         /// 默认构造函数

         /// </summary>

         public MainForm()

         {

             InitializeComponent();

             //给窗体注册键盘事件

             this.KeyPreview = true;

         }

 

         /// <summary>

         /// 初始化窗体,绑定事件

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void MainForm_Load(object sender, EventArgs e)

         {

             this.大图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);

             this.详细信息ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);

             this.平铺ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);

             this.小图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);

             this.列表ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);

         }

         #endregion

 

         #region 事件处理

         /// <summary>

         /// 搜索框符合条件的人员

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnSearch_Click(object sender, EventArgs e)

         {

             AddItemsToListView(txtPath.Text, txtSearch.Text.Trim());

             AddHeaderToListView(this.lvwData);

         }

 

         /// <summary>

         /// 给搜索框添加Enter快捷键

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void MainForm_KeyDown(object sender, KeyEventArgs e)

         {

             //搜索框获得焦点且按下Enter键时,执行搜索

             if (txtSearch.Focused && e.KeyCode == Keys.Enter)

             {

                 this.btnSearch_Click(sender, e);

             }

         }

 

         /// <summary>

         /// 返回上级目录

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnUp_Click(object sender, EventArgs e)

         {

             if (txtPath.Text == rootPath || !txtPath.Text.Contains("\\"))

             {

                 return;

             }

             //找到文件夹上级目录的绝对路径

             txtPath.Text = txtPath.Text.Substring(0, txtPath.Text.LastIndexOf("\\"));

             AddItemsToListView(txtPath.Text);

             AddHeaderToListView(this.lvwData);

         }

 

         /// <summary>

         /// 打开文件夹,显示文件夹

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnFolder_Click(object sender, EventArgs e)

         {

             DialogResult dr = fbdData.ShowDialog();

             string path = fbdData.SelectedPath.ToString();

             if (dr == DialogResult.OK && path != "")

             {

                 rootPath = path;

                 txtPath.Text = path;

             }

         }

 

         /// <summary>

         /// 新建文件夹,选中文件夹

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnAdd_Click(object sender, EventArgs e)

         {

             string fullpath = string.Empty;

             AddForm addForm = new AddForm(btnAdd.Text);

             addForm.ShowDialog();

             if (addForm.ButtonFlag)

             {

                 fullpath = txtPath.Text + "\\" + addForm.TxtName;

             }

             else

             {

                 return; //排除关闭窗口异常

             }

             try

             {

                 if (Directory.Exists(fullpath))

                 {

                     MessageBox.Show("该文件名已经存在!", "提示");

                     return;

                 }

                 Directory.CreateDirectory(fullpath);

                 AddItemsToListView(txtPath.Text);

                 AddHeaderToListView(this.lvwData);

             }

             catch (NullReferenceException ex)

             {

                 MessageBox.Show(ex.Message, "提示");

             }

             finally

             {

                 //选中新增的项,并显示在视野范围内

                 for (int i = 0; i < lvwData.Items.Count; i++)

                 {

                     if (lvwData.Items[i].Tag.ToString() == fullpath)

                     {

                         //先设置ListView选中

                         lvwData.Focus();

                         lvwData.Items[i].Selected = true;

                         //在视野范围内显示

                         lvwData.EnsureVisible(i);

                         break;

                     }

                 }

             }

         }

 

         /// <summary>

         /// 重命名文件夹

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnRename_Click(object sender, EventArgs e)

         {

             if (lvwData.SelectedItems.Count <= 0)

             {

                 return;

             }

             string fullName = lvwData.SelectedItems[0].Tag.ToString();

             string path = fullName.Substring(0, fullName.LastIndexOf("\\") + 1);//文件路径

             string suffix = GetSuffixName(fullName);//后缀名

             //文件名或文件夹名

             string fileName = string.Empty;

             if (suffix != string.Empty)

             {

                 fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1,

                         fullName.LastIndexOf(".") - fullName.LastIndexOf("\\") - 1);//文件名

             }

             else

             {

                 fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1);//文件夹名

             }

             string fullPath = string.Empty;

             AddForm addForm = new AddForm(btnRename.Text, fileName);

             addForm.ShowDialog();

             if (suffix != string.Empty)

             {

                 fullPath = path + addForm.TxtName + "." + suffix;

             }

             else

             {

                 fullPath = path + addForm.TxtName;

             }

             //直接关闭窗口时

             if (!addForm.ButtonFlag)

             {

                 return;

             }

             try

             {

                 //重命名文件夹

                 if (suffix == string.Empty)

                 {

                     if (Directory.Exists(fullPath))

                     {

                         MessageBox.Show("该文件名已经存在!", "提示");

                         return;

                     }

                     Directory.Move(fullName, fullPath);

                 }

                 //重命名文件

                 else

                 {

                     if (File.Exists(fullPath))

                     {

                         MessageBox.Show("该文件名已经存在!", "提示");

                         return;

                     }

                     File.Move(fullName, fullPath);

                 }

                 AddItemsToListView(txtPath.Text);

                 AddHeaderToListView(this.lvwData);

             }

             catch (NullReferenceException ex)

             {

                 MessageBox.Show(ex.Message);

             }

         }

 

         /// <summary>

         /// 删除文件夹

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void btnDelete_Click(object sender, EventArgs e)

         {

             int count = lvwData.SelectedItems.Count;

             if (count <= 0)

             {

                 return;

             }

             DialogResult result = MessageBox.Show("你确定删除这" + count + "项吗?", "提示",

                                     MessageBoxButtons.YesNo, MessageBoxIcon.Question);

             if (result == DialogResult.Yes)

             {

                 string path;

                 ListViewItem selectitem;

                 for (int i = 0; i < lvwData.SelectedItems.Count; ) //此处不能i++

                 {

                     selectitem = lvwData.SelectedItems[i];

                     path = selectitem.Tag.ToString();

                     lvwData.Items.Remove(selectitem);

                     if (File.Exists(path))

                     {

                         File.Delete(path);

                     }

                     else if (Directory.Exists(path))

                     {

                         Directory.Delete(path, true);

                     }

                     lvwData.Update();

                 }

             }

         }

 

         /// <summary>

         /// List选中项时发生

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void lvwData_ItemActivate(object sender, EventArgs e)

         {

             ListView lv = (ListView)sender;

             if (lv.SelectedItems.Count <= 0)

             {

                 return;

             }

             string filename = lv.SelectedItems[0].Tag.ToString();

             //如果是文件夹,就打开它

             if (Directory.Exists(filename))

             {

                 AddItemsToListView(filename);

                 AddHeaderToListView(this.lvwData);

                 //获取打开的文件夹路径

                 txtPath.Text = filename;

             }

             //如果是文件,就执行它

             else

             {

                 System.Diagnostics.Process.Start(filename);

             }

         }

 

         /// <summary>

         /// 根据路径的后缀名控制按钮的状态

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void txtPath_TextChanged(object sender, EventArgs e)

         {

             AddItemsToListView(txtPath.Text);

             AddHeaderToListView(this.lvwData);

         }

 

         /// <summary>

         /// ListView列表显示样式

         /// </summary>

         /// <param name="sender"></param>

         /// <param name="e"></param>

         private void ToolStripMenuItem_Click(object sender, EventArgs e)

         {

             ToolStripMenuItem tsMenumItem = sender as ToolStripMenuItem;

             if (tsMenumItem.Checked)

             {

                 return;//已经选中则返回

             }

             else

             {

                 //清除勾选的右键菜单项

                 ClearCheckState(cmsStyle);

                 //勾选选中的右键菜单项

                 tsMenumItem.Checked = true;

             }

             switch (tsMenumItem.Text)

             {

                 case "大图标":

                     lvwData.View = View.LargeIcon;

                     break;

                 case "详细信息":

                     lvwData.View = View.Details;

                     break;

                 case "小图标":

                     lvwData.View = View.SmallIcon;

                     break;

                 case "列表":

                     lvwData.View = View.List;

                     break;

                 case "平铺":

                     lvwData.View = View.Tile;

                     break;

             }

         }

 

         /// <summary>

         /// 清除勾选的右键菜单项

         /// </summary>

         /// <param name="cms">右键菜单</param>

         /// <param name="clearAll">是否全部清除</param>

         private void ClearCheckState(ContextMenuStrip cms, bool clearAll = false)

         {

             ToolStripMenuItem tsMenumItemTemp;

             for (int i = 0; i < cms.Items.Count; i++)

             {

                 if (!(cms.Items[i] is ToolStripMenuItem))

                 {

                     continue;

                 }

                 tsMenumItemTemp = cms.Items[i] as ToolStripMenuItem;

                 if (tsMenumItemTemp.Checked)

                 {

                     tsMenumItemTemp.Checked = false;

                     if (!clearAll)

                     {

                         break;

                     }

                 }

             }

         }

         #endregion

 

         #region 设置ListView的显示样式

         /// <summary>

         /// 根据后缀名,设置listview显示样式

         /// </summary>

         /// <param name="root">根节点</param>

         /// <param name="keywords">搜索关键字</param>

         private void AddItemsToListView(string root, string keywords = "")

         {

             //把listview里的所有选项与所有列名都删除

             lvwData.Clear();

             lvwData.BeginUpdate();

             //文件

             if (File.Exists(root))

             {

                 AddFileToListView(new FileInfo(root), keywords);

             }

             //文件夹

             else

             {

                 DirectoryInfo dir = new DirectoryInfo(root);

                 DirectoryInfo[] dirs = dir.GetDirectories();

                 FileInfo[] files = dir.GetFiles();

                 //把文件夹信息添加到listview的选项中

                 foreach (DirectoryInfo directoryInfo in dirs)

                 {

                     AddFolderToListView(directoryInfo, keywords);

                 }

                 //把文件夹下文件信息添加到listview的选项中

                 foreach (FileInfo fileInfo in files)

                 {

                     AddFileToListView(fileInfo, keywords);

                 }

             }

             this.lvwData.EndUpdate();

         }

 

         /// <summary>

         /// 将文件添加到ListView中显示

         /// </summary>

         /// <param name="fileInfo">文件全路径</param>

         /// <param name="keywords">搜索关键字</param>

         private void AddFileToListView(FileInfo fileInfo, string keywords)

         {

             ListViewItem lvi = new ListViewItem();//文件项

             lvi.Tag = fileInfo.FullName;

             lvi.Text = fileInfo.Name;

             lvi.ImageIndex = imgLarge.Images.Count - 1;

             if (keywords != "" && (!lvi.Text.Contains(keywords)))

             {

                 return;//搜索不到关键字,不将文件添加到ListView中显示

             }

             //文件的名称属性项

             lvi.SubItems[0].Tag = lvi.Tag;

             lvi.SubItems[0].Text = lvi.Text;

             //文件大小属性项

             ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();

             lvsi.Tag = fileInfo.Length;

             lvsi.Text = fileInfo.Length / 1024 + " KB";

             lvi.SubItems.Add(lvsi);

             //修改日期属性项

             lvsi = new ListViewItem.ListViewSubItem();

             lvsi.Tag = fileInfo.LastAccessTime.ToString();

             lvsi.Text = fileInfo.LastAccessTime.ToString();

             lvi.SubItems.Add(lvsi);

             //添加文件

             this.lvwData.Items.Add(lvi);

         }

 

         /// <summary>

         /// 将文件夹添加到ListView中显示

         /// </summary>

         /// <param name="DirectoryInfo">文件夹</param>

         /// <param name="keywords">搜索关键字</param>

         private void AddFolderToListView(DirectoryInfo DirectoryInfo, string keywords)

         {

             ListViewItem lvi = new ListViewItem();

             lvi.Tag = DirectoryInfo.FullName;

             lvi.Text = DirectoryInfo.Name;//显示名称

             lvi.ImageIndex = 0;

             if (keywords != "" && (!lvi.Text.Contains(keywords)))

             {

                 return;//搜索不到关键字,不将文件夹添加到ListView中显示

             }

             // 文件夹的名称属性项

             lvi.SubItems[0].Tag = lvi.Tag;

             lvi.SubItems[0].Text = lvi.Text;

             //文件夹大小属性项

             ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();

             lvsi.Tag = GetFolderSize(DirectoryInfo);

             lvsi.Text = FormatFolderSize(folderSize);

             folderSize = 0;//清零计算文件夹大小的变量

             lvi.SubItems.Add(lvsi);

             //修改日期属性项

             lvsi = new ListViewItem.ListViewSubItem();

             lvsi.Tag = DirectoryInfo.LastAccessTime.ToString();

             lvsi.Text = DirectoryInfo.LastAccessTime.ToString();

             lvi.SubItems.Add(lvsi);

             //添加文件夹

             this.lvwData.Items.Add(lvi);

         }

 

         /// <summary>

         /// 递归计算文件夹的大小

         /// </summary>

         /// <param name="DirectoryInfo">文件夹</param>

         /// <returns>文件夹大小</returns>

         private long GetFolderSize(DirectoryInfo DirectoryInfo)

         {

             DirectoryInfo[] dirs = DirectoryInfo.GetDirectories();

             FileInfo[] files = DirectoryInfo.GetFiles();

             //是文件夹时,继续递归

             if (dirs.Length > 0)

             {

                 foreach (DirectoryInfo dir in dirs)

                 {

                     GetFolderSize(dir);

                 }

             }

             //是文件时,进行累加计算

             foreach (FileInfo fi in files)

             {

                 folderSize = folderSize + fi.Length;

             }

             return folderSize;

         }

 

         /// <summary>

         /// 将文件夹大小转化为直观的文字显示

         /// </summary>

         /// <param name="size">文件夹大小</param>

         /// <returns>文件夹大小的文字表示</returns>

         private string FormatFolderSize(long size)

         {

             if ((size >> 20) > 0)

             {

                 //保留两位小数

                 return ((size >> 10) / 1024.0).ToString("F2") + " MB";

             }

             else

             {

                 return (size >> 10) + " KB";

             }

         }

 

         /// <summary>

         /// 为listview添加列标题

         /// </summary>

         private void AddHeaderToListView(ListView listView)

         {

             ColumnHeader ch = new ColumnHeader();

             ch.Text = "文件名";

             ch.Width = 120;

             listView.Columns.Add(ch);

 

             ch = new ColumnHeader();

             ch.Width = 70;

             ch.Text = "大小";

             listView.Columns.Add(ch);

 

             ch = new ColumnHeader();

             ch.Text = "修改日期";

             ch.Width = 140;

             listView.Columns.Add(ch);

         }

         #endregion

 

         #region 经常使用的公共方法

         /// <summary>

         /// 获取文件后缀名(小写)

         /// </summary>

         /// <param name="path">文件全路径或文件名</param>

         public string GetSuffixName(string path)

         {

             string suffix = string.Empty;

             if (path.Contains("."))

             {

                 suffix = path.Substring(path.LastIndexOf(".") + 1);//后缀名

             }

             return suffix.ToLower();

         }

 

         /// <summary>

         /// 获取应用程序根路径

         /// </summary>

         public static string GetApplicationPath()

         {

             string path = Application.StartupPath;

             string folderName = String.Empty;

             while (folderName.ToLower() != "bin")

             {

                 path = path.Substring(0, path.LastIndexOf("\\"));

                 folderName = path.Substring(path.LastIndexOf("\\") + 1);

             }

             return path.Substring(0, path.LastIndexOf("\\") + 1);

         }

         #endregion

     }

 }
0 0