在项目中的前面一篇文章"C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标"中我讲述了如何使用TreeView控件树状实现显示"我的电脑"所有磁盘路径下的文件夹,并加载图标如下图所示.

此篇文章我需要讲述的是当鼠标点击左边的TreeView控件中的文件夹时,如何实现在右边的ListView控件中显示相应的文件,并显示文件的名称、大小、类型属性.主要运用的知识是如何实现ListView显示信息,Subitems()函数增加子项,如何设置列表头等信息.运行结果如下图所示:

一.Load函数中加载ListView列标题头

在前篇文章基础上,把控件filesList(ListView控件)拉长,并设置Form1的属性FormBorderStyle(窗体边框和标题栏外观)为FixedSingle,此时该窗体不能拖动拉长.通过Form1_Load()函数初始加载ListView的标题头(名称、大小、类型).代码如下:

/// <summary>
/// 窗体加载Load事件 初始化
/// </summary>
private void Form1_Load(object sender, EventArgs e)
{....//调用SetListView()函数初始化设置ListViewSetListView();
}
/// <summary>
/// 自定义函数设置ListView控件初始属性
/// </summary>
private void SetListView()
{//行和列是否显示网格线this.filesList.GridLines = false;//显示方式(注意View是Details详细显示)this.filesList.View = View.Details;//是否可编辑this.filesList.LabelEdit = true;//没有足够的空间显示时,是否添加滚动条this.filesList.Scrollable = true;//对表头进行设置this.filesList.HeaderStyle = ColumnHeaderStyle.Clickable;//是否可以选择行this.filesList.FullRowSelect = true;//设置listView列标题头 宽度为9/13 2/13 2/13 //其中设置标题头自动适应宽度,-1根据内容设置宽度,-2根据标题设置宽度this.filesList.Columns.Add("名称", 9 * filesList.Width / 13);   this.filesList.Columns.Add("大小", 2 * filesList.Width / 13);this.filesList.Columns.Add("类型", 2 * filesList.Width / 13);
}

二.AfterSelect事件实现ListView加载数据

现在需要在"解决方案"中点击directoryTree(TreeView控件,左边的树状图控件)添加AfterSelect事件,当选中某个节点后,通过该事件显示该文件夹下的所有文件信息.代码如下:

#region ListView显示选中文件夹中文件内容
/// <summary>
/// 获取节点的路径:递归调用产生节点对应文件夹的路径
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private string GetPathFromNode(TreeNode node)
{//注意:树形控件中我只赋值Tag\Name,使用Text时赋值即可使用if (node.Parent == null){return node.Name;}//Path.Combine组合产生路径 如 Path.Combine("A","B")则生成"A\\B"return Path.Combine(GetPathFromNode(node.Parent), node.Name);
}/// <summary>
/// 更改选定内容后发生 后去当前节点名字
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void directoryTree_AfterSelect(object sender, TreeViewEventArgs e)
{try{//定义变量long length;                        //文件大小string path;                        //文件路径TreeNode clickedNode = e.Node;      //获取当前选中结点//移除ListView所有项 this.filesList.Items.Clear();       //获取路径赋值path              if (clickedNode.Tag.ToString() == "我的文档"){//获取计算机我的文档文件夹path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);}else{//通过自定义函数GetPathFromNode获取结点路径path = GetPathFromNode(clickedNode);}//由于"我的电脑"为空结点,无需处理,否则会出现路径获取错误或没有找到"我的电脑"路径if (clickedNode.Tag.ToString() != "我的电脑"){//数据更新 UI暂时挂起直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度this.filesList.BeginUpdate();//实例目录与子目录DirectoryInfo dir = new DirectoryInfo(path);//获取当前目录文件列表FileInfo[] fileInfo = dir.GetFiles();//循环输出获取文件信息for (int i = 0; i < fileInfo.Length; i++){ListViewItem listItem = new ListViewItem();//listItem.SubItems[0].Text = fileInfo[i].Name;             //文件名(方法二)listItem.Text = "[" + (i + 1) + "] " + fileInfo[i].Name;    //显示文件名listItem.ForeColor = Color.Blue;                            //设置行颜色//length/1024转换为KB字节数整数值 Ceiling返回最小整数值 Divide除法length = fileInfo[i].Length;                                //获取当前文件大小listItem.SubItems.Add(Math.Ceiling(decimal.Divide(length, 1024)) + " KB");//获取文件最后访问时间//listItem.SubItems.Add(fileInfo[i].LastWriteTime.ToString());//获取文件扩展名时可用Substring除去点 否则显示".txt文件"listItem.SubItems.Add(fileInfo[i].Extension + "文件");//加载数据至filesListthis.filesList.Items.Add(listItem);}//结束数据处理,UI界面一次性绘制 否则可能出现闪动情况this.filesList.EndUpdate();  }}catch (Exception msg)  //异常处理{MessageBox.Show(msg.Message);}
}
#endregion

三.遇到的问题

这篇文章看似简单,其实过程遇到很多问题还是值得学习的.
1.遇到的第一个问题就是为什么使用ListView控件总是只显示第一列数据呢?为什么设置了列标题Columns没有显示出来呢?
因为我在程序中初始化后又添加一段代码filesList.View = View.List;设置了View显示的视图为List.而View属性包括五种显示方式:Details(详细信息)、List(列表)、LargeIcon(大图标)、SmallIcon(小图标)、Tile.默认时LargeIcon此时显示为乱序,如果想显示详细信息一行一行的需要设置为Details.
这里推荐大家阅读夜之子的"
C# ListView用法详解",真心神作!此处引用他文章中的4张图区别View不同属性显示情况.

2.遇到的第二个问题主要是如何添加数据?如何添加列标题头?
可以采用listItem.SubItems[0].Text添加,但是listItem.SubItems[1]时会报错"InvalidArgument="1"的值对于"Index"无效.参数:index".估计原因是tem没有填入123,所以我采用的方法是listItem.SubItems.Add添加.
3.使用"this.filesList.BeginUpdate()"和"this.filesList.EndUpdate()"数据更新时UI暂时挂起直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度.否则由于加载数据较大时会出现闪烁或空白遮挡等问题.

四.总结

最后希望该文章对大家有所帮助,感谢上面提到的文章及作者.同时如果文章中有错误或不足之处请原谅,有问题或建议者亦可提出.希望尊重作者劳动果实.接下来想实现的是使用API函数添加文件图标和实现右键打开文件和删除文件的操作.仅以此篇文章纪念自己在CSDN发表50篇博客.
文件免费下载地址:http://download.csdn.net/detail/eastmount/7041767
MFC实现该功能类似文章:http://blog.csdn.net/eastmount/article/details/19120567
(By:Eastmount 2014-3-14 下午6点 原创CSDNhttp://blog.csdn.net/eastmount/)

C# 系统应用之ListView控件 (二).加载选中节点文件夹下文件信息相关推荐

  1. C# 系统应用之ListView控件 (三).添加ContextMenuStrip右键菜单打开删除文件

    在前面讲述过使用TreeView控件和ListView控件显示磁盘目录信息,但仅仅是显示信息是不够的,我们还需要具体的操作.在"个人电脑使用历史痕迹"项目中我还需要添加" ...

  2. MapGis二次开发——基础地图目录树控件的加载

    MapGis二次开发--基础地图目录树控件的加载 第一步:添加MapGis引用 MapGis动态库位置是在你安装位置下的\Program\plugin下,例如我的安装位置就是:D:\MapGIS 10 ...

  3. 如何实现SAP UI5 Web Component React控件的加载效果

    假设我使用SAP UI5 Web Component的React控件, 比如柱状图和折线图: 导入useState函数,默认加载状态为false: 每次点击屏幕后,首先将Loading状态使用切换函数 ...

  4. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

    本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemTe ...

  5. java imageview的使用_Android使用控件ImageView加载图片的方法

    在 Android 加载图片一般使用 ImageView,这里简单记录一下这个控件的使用方法. 最简单就是在 xml 里直接使用 ImageView 标签: android:orientation=& ...

  6. html 自动加载activex控件,管理加载项未显示加载控件

    已安装控件,但是在"管理加载项"中"所有加载项"中就是这个: 已安装的控件只有在网页调用此控件时才会在加载项里出现 IE加载项没有禁用Flash Player为 ...

  7. win7 64位 web项目OCX控件无法加载原因

    多了不说什么 ,直接切入主题 首先,你要确认你要加载的控件已经成功的注册了,如果没有注册,请按照以下方式注册 注册成功之后,如果界面依然没有加载控件,则考虑注册表的影响了 将ocx文件拷贝到SysWO ...

  8. asp.net 动态创建TextBox控件 如何加载状态信息

    接着上文Asp.net TextBox的TextChanged事件你真的清楚吗? 这里我们来说说状态数据时如何加载的. 虽然在Control中有调用状态转存的方法,但是这里有一个判断条件 if (_c ...

  9. calendar控件使用 extjs_ExtJs定制日历控件——自动加载更新(日历控件显示)

    将定制的日历控件放到一个Panel里显示,其结构如下: , { border: true, id: 'page', animCollapse : true, width: 1050, height: ...

最新文章

  1. vue实现点击改变颜色
  2. pxe+kickstart部署多个版本的Linux操作系统(上)---原理篇
  3. Python中提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
  4. frida hook java层常用模板
  5. leetcode 384. Shuffle an Array | 384. 打乱数组(Fisher-Yates洗牌算法)
  6. 重磅!win10无法安装.NET Framework 3.5服务解决办法(附离线安装包下载)
  7. python 笔记(三) 断言(assert)
  8. php str_replice_详解PHP字符串替换str_replace()函数四种用法
  9. java hashset 实现原理_深入Java集合学习系列:HashSet的实现原理
  10. Spring框架知识要点总结(第一天)
  11. apache tomcat 6集群负载和session复制(转)
  12. 小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍
  13. Ubuntu 安装 peek 动态截图软件
  14. 回顾|Apache Flink Meetup · 北京站(附问题解答 PPT 下载)
  15. 单阶段目标检测算法YOLOv3
  16. Windows部署solr服务,启动solr单机模式和solrCould模式
  17. Android 传感器开发详解
  18. LC1514. 概率最大的路径
  19. 海思开发板实用技巧集
  20. UVa-12325宝箱

热门文章

  1. Guava Cache用法介绍
  2. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
  3. MySQL升级后 MySQL 5.7 时间不兼容问题
  4. C语言实现随机生成0~100的数
  5. iOS 10 的一个重要更新-开发 iMessage 的第三方插件
  6. 设计一个简单的缓存容器
  7. 实验11.1 指针数组、指针与函数 6-5 查找子串
  8. java局域网 端口扫描_java 如何端口扫描出ssh端口?
  9. L2-1 包装机 (25 分)(STL43行代码)
  10. C语言程序练习-L1-018 大笨钟 (10分)