首页 > 代码库 > C#winform中ListView的使用
C#winform中ListView的使用
使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览、重命名、删除及查询等功能,主要功能界面展示如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 11 namespace Controls 12 { 13 public partial class MainForm : Form 14 { 15 #region 成员变量 16 /// <summary> 17 /// 用于递归计算文件夹大小 18 /// </summary> 19 private long folderSize = 0; 20 21 /// <summary> 22 ///打开文件夹根路径 23 /// </summary> 24 private string rootPath = string.Empty; 25 #endregion 26 27 #region 初期化 28 /// <summary> 29 /// 默认构造函数 30 /// </summary> 31 public MainForm() 32 { 33 InitializeComponent(); 34 //给窗体注册键盘事件 35 this.KeyPreview = true; 36 } 37 38 /// <summary> 39 /// 初始化窗体,绑定事件 40 /// </summary> 41 /// <param name="sender"></param> 42 /// <param name="e"></param> 43 private void MainForm_Load(object sender, EventArgs e) 44 { 45 this.大图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); 46 this.详细信息ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); 47 this.平铺ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); 48 this.小图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); 49 this.列表ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); 50 } 51 #endregion 52 53 #region 事件处理 54 /// <summary> 55 /// 搜索框符合条件的人员 56 /// </summary> 57 /// <param name="sender"></param> 58 /// <param name="e"></param> 59 private void btnSearch_Click(object sender, EventArgs e) 60 { 61 AddItemsToListView(txtPath.Text, txtSearch.Text.Trim()); 62 AddHeaderToListView(this.lvwData); 63 } 64 65 /// <summary> 66 /// 给搜索框添加Enter快捷键 67 /// </summary> 68 /// <param name="sender"></param> 69 /// <param name="e"></param> 70 private void MainForm_KeyDown(object sender, KeyEventArgs e) 71 { 72 //搜索框获得焦点且按下Enter键时,执行搜索 73 if (txtSearch.Focused && e.KeyCode == Keys.Enter) 74 { 75 this.btnSearch_Click(sender, e); 76 } 77 } 78 79 /// <summary> 80 /// 返回上级目录 81 /// </summary> 82 /// <param name="sender"></param> 83 /// <param name="e"></param> 84 private void btnUp_Click(object sender, EventArgs e) 85 { 86 if (txtPath.Text == rootPath || !txtPath.Text.Contains("\\")) 87 { 88 return; 89 } 90 //找到文件夹上级目录的绝对路径 91 txtPath.Text = txtPath.Text.Substring(0, txtPath.Text.LastIndexOf("\\")); 92 AddItemsToListView(txtPath.Text); 93 AddHeaderToListView(this.lvwData); 94 } 95 96 /// <summary> 97 /// 打开文件夹,显示文件夹 98 /// </summary> 99 /// <param name="sender"></param>100 /// <param name="e"></param>101 private void btnFolder_Click(object sender, EventArgs e)102 {103 DialogResult dr = fbdData.ShowDialog();104 string path = fbdData.SelectedPath.ToString();105 if (dr == DialogResult.OK && path != "")106 {107 rootPath = path;108 txtPath.Text = path;109 }110 }111 112 /// <summary>113 /// 新建文件夹,选中文件夹114 /// </summary>115 /// <param name="sender"></param>116 /// <param name="e"></param>117 private void btnAdd_Click(object sender, EventArgs e)118 {119 string fullpath = string.Empty;120 AddForm addForm = new AddForm(btnAdd.Text);121 addForm.ShowDialog();122 if (addForm.ButtonFlag)123 {124 fullpath = txtPath.Text + "\\" + addForm.TxtName;125 }126 else127 {128 return; //排除关闭窗口异常129 }130 try131 {132 if (Directory.Exists(fullpath))133 {134 MessageBox.Show("该文件名已经存在!", "提示");135 return;136 }137 Directory.CreateDirectory(fullpath);138 AddItemsToListView(txtPath.Text);139 AddHeaderToListView(this.lvwData);140 }141 catch (NullReferenceException ex)142 {143 MessageBox.Show(ex.Message, "提示");144 }145 finally146 {147 //选中新增的项,并显示在视野范围内148 for (int i = 0; i < lvwData.Items.Count; i++)149 {150 if (lvwData.Items[i].Tag.ToString() == fullpath)151 {152 //先设置ListView选中153 lvwData.Focus();154 lvwData.Items[i].Selected = true;155 //在视野范围内显示156 lvwData.EnsureVisible(i);157 break;158 }159 }160 }161 }162 163 /// <summary>164 /// 重命名文件夹165 /// </summary>166 /// <param name="sender"></param>167 /// <param name="e"></param>168 private void btnRename_Click(object sender, EventArgs e)169 {170 if (lvwData.SelectedItems.Count <= 0)171 {172 return;173 }174 string fullName = lvwData.SelectedItems[0].Tag.ToString();175 string path = fullName.Substring(0, fullName.LastIndexOf("\\") + 1);//文件路径176 string suffix = GetSuffixName(fullName);//后缀名177 //文件名或文件夹名178 string fileName = string.Empty;179 if (suffix != string.Empty)180 {181 fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1,182 fullName.LastIndexOf(".") - fullName.LastIndexOf("\\") - 1);//文件名183 }184 else185 {186 fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1);//文件夹名187 }188 string fullPath = string.Empty;189 AddForm addForm = new AddForm(btnRename.Text, fileName);190 addForm.ShowDialog();191 if (suffix != string.Empty)192 {193 fullPath = path + addForm.TxtName + "." + suffix;194 }195 else196 {197 fullPath = path + addForm.TxtName;198 }199 //直接关闭窗口时200 if (!addForm.ButtonFlag)201 {202 return;203 }204 try205 {206 //重命名文件夹207 if (suffix == string.Empty)208 {209 if (Directory.Exists(fullPath))210 {211 MessageBox.Show("该文件名已经存在!", "提示");212 return;213 }214 Directory.Move(fullName, fullPath);215 }216 //重命名文件217 else218 {219 if (File.Exists(fullPath))220 {221 MessageBox.Show("该文件名已经存在!", "提示");222 return;223 }224 File.Move(fullName, fullPath);225 }226 AddItemsToListView(txtPath.Text);227 AddHeaderToListView(this.lvwData);228 }229 catch (NullReferenceException ex)230 {231 MessageBox.Show(ex.Message);232 }233 }234 235 /// <summary>236 /// 删除文件夹237 /// </summary>238 /// <param name="sender"></param>239 /// <param name="e"></param>240 private void btnDelete_Click(object sender, EventArgs e)241 {242 int count = lvwData.SelectedItems.Count;243 if (count <= 0)244 {245 return;246 }247 DialogResult result = MessageBox.Show("你确定删除这" + count + "项吗?", "提示",248 MessageBoxButtons.YesNo, MessageBoxIcon.Question);249 if (result == DialogResult.Yes)250 {251 string path;252 ListViewItem selectitem;253 for (int i = 0; i < lvwData.SelectedItems.Count; ) //此处不能i++254 {255 selectitem = lvwData.SelectedItems[i];256 path = selectitem.Tag.ToString();257 lvwData.Items.Remove(selectitem);258 if (File.Exists(path))259 {260 File.Delete(path);261 }262 else if (Directory.Exists(path))263 {264 Directory.Delete(path, true);265 }266 lvwData.Update();267 }268 }269 }270 271 /// <summary>272 /// List选中项时发生273 /// </summary>274 /// <param name="sender"></param>275 /// <param name="e"></param>276 private void lvwData_ItemActivate(object sender, EventArgs e)277 {278 ListView lv = (ListView)sender;279 if (lv.SelectedItems.Count <= 0)280 {281 return;282 }283 string filename = lv.SelectedItems[0].Tag.ToString();284 //如果是文件夹,就打开它285 if (Directory.Exists(filename))286 {287 AddItemsToListView(filename);288 AddHeaderToListView(this.lvwData);289 //获取打开的文件夹路径290 txtPath.Text = filename;291 }292 //如果是文件,就执行它293 else294 {295 System.Diagnostics.Process.Start(filename);296 }297 }298 299 /// <summary>300 /// 根据路径的后缀名控制按钮的状态301 /// </summary>302 /// <param name="sender"></param>303 /// <param name="e"></param>304 private void txtPath_TextChanged(object sender, EventArgs e)305 {306 AddItemsToListView(txtPath.Text);307 AddHeaderToListView(this.lvwData);308 }309 310 /// <summary>311 /// ListView列表显示样式312 /// </summary>313 /// <param name="sender"></param>314 /// <param name="e"></param>315 private void ToolStripMenuItem_Click(object sender, EventArgs e)316 {317 ToolStripMenuItem tsMenumItem = sender as ToolStripMenuItem;318 if (tsMenumItem.Checked)319 {320 return;//已经选中则返回321 }322 else323 {324 //清除勾选的右键菜单项325 ClearCheckState(cmsStyle);326 //勾选选中的右键菜单项327 tsMenumItem.Checked = true;328 }329 switch (tsMenumItem.Text)330 {331 case "大图标":332 lvwData.View = View.LargeIcon;333 break;334 case "详细信息":335 lvwData.View = View.Details;336 break;337 case "小图标":338 lvwData.View = View.SmallIcon;339 break;340 case "列表":341 lvwData.View = View.List;342 break;343 case "平铺":344 lvwData.View = View.Tile;345 break;346 }347 }348 349 /// <summary>350 /// 清除勾选的右键菜单项351 /// </summary>352 /// <param name="cms">右键菜单</param>353 /// <param name="clearAll">是否全部清除</param>354 private void ClearCheckState(ContextMenuStrip cms, bool clearAll = false)355 {356 ToolStripMenuItem tsMenumItemTemp;357 for (int i = 0; i < cms.Items.Count; i++)358 {359 if (!(cms.Items[i] is ToolStripMenuItem))360 {361 continue;362 }363 tsMenumItemTemp = cms.Items[i] as ToolStripMenuItem;364 if (tsMenumItemTemp.Checked)365 {366 tsMenumItemTemp.Checked = false;367 if (!clearAll)368 {369 break;370 }371 }372 }373 }374 #endregion375 376 #region 设置ListView的显示样式377 /// <summary>378 /// 根据后缀名,设置listview显示样式379 /// </summary>380 /// <param name="root">根节点</param>381 /// <param name="keywords">搜索关键字</param>382 private void AddItemsToListView(string root, string keywords = "")383 {384 //把listview里的所有选项与所有列名都删除385 lvwData.Clear();386 lvwData.BeginUpdate();387 //文件388 if (File.Exists(root))389 {390 AddFileToListView(new FileInfo(root), keywords);391 }392 //文件夹393 else394 {395 DirectoryInfo dir = new DirectoryInfo(root);396 DirectoryInfo[] dirs = dir.GetDirectories();397 FileInfo[] files = dir.GetFiles();398 //把文件夹信息添加到listview的选项中399 foreach (DirectoryInfo directoryInfo in dirs)400 {401 AddFolderToListView(directoryInfo, keywords);402 }403 //把文件夹下文件信息添加到listview的选项中404 foreach (FileInfo fileInfo in files)405 {406 AddFileToListView(fileInfo, keywords);407 }408 }409 this.lvwData.EndUpdate();410 }411 412 /// <summary>413 /// 将文件添加到ListView中显示414 /// </summary>415 /// <param name="fileInfo">文件全路径</param>416 /// <param name="keywords">搜索关键字</param>417 private void AddFileToListView(FileInfo fileInfo, string keywords)418 {419 ListViewItem lvi = new ListViewItem();//文件项420 lvi.Tag = fileInfo.FullName;421 lvi.Text = fileInfo.Name;422 lvi.ImageIndex = imgLarge.Images.Count - 1;423 if (keywords != "" && (!lvi.Text.Contains(keywords)))424 {425 return;//搜索不到关键字,不将文件添加到ListView中显示426 }427 //文件的名称属性项428 lvi.SubItems[0].Tag = lvi.Tag;429 lvi.SubItems[0].Text = lvi.Text;430 //文件大小属性项431 ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();432 lvsi.Tag = fileInfo.Length;433 lvsi.Text = fileInfo.Length / 1024 + " KB";434 lvi.SubItems.Add(lvsi);435 //修改日期属性项436 lvsi = new ListViewItem.ListViewSubItem();437 lvsi.Tag = fileInfo.LastAccessTime.ToString();438 lvsi.Text = fileInfo.LastAccessTime.ToString();439 lvi.SubItems.Add(lvsi);440 //添加文件441 this.lvwData.Items.Add(lvi);442 }443 444 /// <summary>445 /// 将文件夹添加到ListView中显示446 /// </summary>447 /// <param name="DirectoryInfo">文件夹</param>448 /// <param name="keywords">搜索关键字</param>449 private void AddFolderToListView(DirectoryInfo DirectoryInfo, string keywords)450 {451 ListViewItem lvi = new ListViewItem();452 lvi.Tag = DirectoryInfo.FullName;453 lvi.Text = DirectoryInfo.Name;//显示名称454 lvi.ImageIndex = 0;455 if (keywords != "" && (!lvi.Text.Contains(keywords)))456 {457 return;//搜索不到关键字,不将文件夹添加到ListView中显示458 }459 // 文件夹的名称属性项460 lvi.SubItems[0].Tag = lvi.Tag;461 lvi.SubItems[0].Text = lvi.Text;462 //文件夹大小属性项463 ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();464 lvsi.Tag = GetFolderSize(DirectoryInfo);465 lvsi.Text = FormatFolderSize(folderSize);466 folderSize = 0;//清零计算文件夹大小的变量467 lvi.SubItems.Add(lvsi);468 //修改日期属性项469 lvsi = new ListViewItem.ListViewSubItem();470 lvsi.Tag = DirectoryInfo.LastAccessTime.ToString();471 lvsi.Text = DirectoryInfo.LastAccessTime.ToString();472 lvi.SubItems.Add(lvsi);473 //添加文件夹474 this.lvwData.Items.Add(lvi);475 }476 477 /// <summary>478 /// 递归计算文件夹的大小479 /// </summary>480 /// <param name="DirectoryInfo">文件夹</param>481 /// <returns>文件夹大小</returns>482 private long GetFolderSize(DirectoryInfo DirectoryInfo)483 {484 DirectoryInfo[] dirs = DirectoryInfo.GetDirectories();485 FileInfo[] files = DirectoryInfo.GetFiles();486 //是文件夹时,继续递归487 if (dirs.Length > 0)488 {489 foreach (DirectoryInfo dir in dirs)490 {491 GetFolderSize(dir);492 }493 }494 //是文件时,进行累加计算495 foreach (FileInfo fi in files)496 {497 folderSize = folderSize + fi.Length;498 }499 return folderSize;500 }501 502 /// <summary>503 /// 将文件夹大小转化为直观的文字显示504 /// </summary>505 /// <param name="size">文件夹大小</param>506 /// <returns>文件夹大小的文字表示</returns>507 private string FormatFolderSize(long size)508 {509 if ((size >> 20) > 0)510 {511 //保留两位小数512 return ((size >> 10) / 1024.0).ToString("F2") + " MB";513 }514 else515 {516 return (size >> 10) + " KB";517 }518 }519 520 /// <summary>521 /// 为listview添加列标题522 /// </summary>523 private void AddHeaderToListView(ListView listView)524 {525 ColumnHeader ch = new ColumnHeader();526 ch.Text = "文件名";527 ch.Width = 120;528 listView.Columns.Add(ch);529 530 ch = new ColumnHeader();531 ch.Width = 70;532 ch.Text = "大小";533 listView.Columns.Add(ch);534 535 ch = new ColumnHeader();536 ch.Text = "修改日期";537 ch.Width = 140;538 listView.Columns.Add(ch);539 }540 #endregion541 542 #region 经常使用的公共方法543 /// <summary>544 /// 获取文件后缀名(小写)545 /// </summary>546 /// <param name="path">文件全路径或文件名</param>547 public string GetSuffixName(string path)548 {549 string suffix = string.Empty;550 if (path.Contains("."))551 {552 suffix = path.Substring(path.LastIndexOf(".") + 1);//后缀名553 }554 return suffix.ToLower();555 }556 557 /// <summary>558 /// 获取应用程序根路径559 /// </summary>560 public static string GetApplicationPath()561 {562 string path = Application.StartupPath;563 string folderName = String.Empty;564 while (folderName.ToLower() != "bin")565 {566 path = path.Substring(0, path.LastIndexOf("\\"));567 folderName = path.Substring(path.LastIndexOf("\\") + 1);568 }569 return path.Substring(0, path.LastIndexOf("\\") + 1);570 }571 #endregion572 }573 }
1. C#winform中ListView及ContextMenuStrip的使用:http://www.cnblogs.com/makesense/p/4079835.html
2.C#winform点击ListView列标题进行排序:http://bbs.csdn.net/topics/350071962
C#winform中ListView的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。