日期:2014-05-16  浏览次数:20949 次

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

在项目中的前面一篇文章"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()函数初始化设置ListView
    SetListView();
}
/// <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);