C#编程基础(下)—项目实践2:利用TreeView和ListView制作文件资源管理器效果-显示当前VS项目资源

版权声明:王迪 https://blog.csdn.net/dnruanjian/article/details/88798155

知识点:TreeView控件、ListView控件的使用、SplitContainer控件的使用

        Visual Studio 的优势之一是能够在较短的时间中创建具有专业外观的 Windows 窗体应用程序。 一种常见的方法是,使用ListView和TreeView控件,创建类似于 Windows 操作系统的 Windows 资源管理器功能的用户界面 (UI)。 Windows 资源管理器中显示用户的计算机上的文件和文件夹的层次结构。

功能需求:点击左侧TreeView控件里的节点,右侧ListView控件里显示对应的文件内容。

实现步骤:

第一步:在VS软件中新建项目。

第二步:从工具箱中添加一个SplitContainer控件到窗体上,并设置SplitContainer控件的Dock属性为Fill。

SplitContainer控件可视为一个复合控件,它是由可移动条隔开的两个面板。 当鼠标指针位于条上方时,指针将改变形状以表示条可移动,此时可以调整左右两边的宽度。

第三步:从工具箱添加一个ImageList控件到窗体,并设置Images属性,添加两张图片。

第四步:从工具箱添加一个TreeView控件到窗体,并将它放置于SplitContainer控件的左侧,调整它的大小,使其填满左侧。同时设置Dock属性为Fill,设置ImageList属性为imageList1。

第五步:从工具箱添加一个ListView控件到窗体上,并将它放置于SplitContainer控件的右侧,调整它的大小,使其填满右侧。同时设置Dock属性为Fill,View属性设置为Details,SmallImageList 属性设置为 imageList1。

设置ListView控件的Columns属性,即设置详细视图里列的名称,添加3个ClolumnHeader,分别为(Name、Type、和Last Modified)

第六步:实现代码填充TreeView节点和子节点。 将此代码添加到Form1类。方法:在解决方案资源管理器中,找到文件Form1.cs,在文件名称上单击鼠标右键,点击【查看代码】,即可进入代码编写模式。

添加代码:

private void PopulateTreeView()
{
    TreeNode rootNode;
    
    DirectoryInfo info = new DirectoryInfo(@"../..");
    if (info.Exists)
    {
        rootNode = new TreeNode(info.Name);
        rootNode.Tag = info;
        GetDirectories(info.GetDirectories(), rootNode);
        treeView1.Nodes.Add(rootNode);
    }
}

private void GetDirectories(DirectoryInfo[] subDirs, 
    TreeNode nodeToAddTo)
{
    TreeNode aNode;
    DirectoryInfo[] subSubDirs;
    foreach (DirectoryInfo subDir in subDirs)
    {
        aNode = new TreeNode(subDir.Name, 0, 0);
        aNode.Tag = subDir;
        aNode.ImageKey = "folder";
        subSubDirs = subDir.GetDirectories();
        if (subSubDirs.Length != 0)
        {
            GetDirectories(subSubDirs, aNode);
        }
        nodeToAddTo.Nodes.Add(aNode);
    }
}

添加此代码以后会发现程序出现错误提示:是因为前面的代码使用 System.IO 命名空间,因此添加相应的使用或导入窗体顶部的语句即可。

第七步:从上一步中窗体的构造函数调用设置方法或Load事件处理方法。 将代码PopulateTreeView();添加到窗体构造函数。

public Form1()
{
    InitializeComponent();
    PopulateTreeView();
}

第八步:给treeview1 控件添加NodeMouseClick事件, 并实现代码来填充listview1单击节点时的节点的内容。添加以下代码到NodeMouseClick事件里。

 TreeNode newSelected = e.Node;
    listView1.Items.Clear();
    DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
    ListViewItem.ListViewSubItem[] subItems;
    ListViewItem item = null;

    foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
    {
        item = new ListViewItem(dir.Name, 0);
        subItems = new ListViewItem.ListViewSubItem[]
            {new ListViewItem.ListViewSubItem(item, "Directory"), 
             new ListViewItem.ListViewSubItem(item, 
                dir.LastAccessTime.ToShortDateString())};
        item.SubItems.AddRange(subItems);
        listView1.Items.Add(item);
    }
    foreach (FileInfo file in nodeDirInfo.GetFiles())
    {
        item = new ListViewItem(file.Name, 1);
        subItems = new ListViewItem.ListViewSubItem[]
            { new ListViewItem.ListViewSubItem(item, "File"), 
             new ListViewItem.ListViewSubItem(item, 
                file.LastAccessTime.ToShortDateString())};

        item.SubItems.AddRange(subItems);
        listView1.Items.Add(item);
    }

    listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

第九步:启动运行。点击左侧TreeView里的节点(目录名称),右侧ListView控件对应打开该节点(目录)下所有的文件。

完整代码:(如果复制完整代码,注意项目名称是否一致)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PopulateTreeView();
        }
        private void PopulateTreeView()
        {
            TreeNode rootNode;

            DirectoryInfo info = new DirectoryInfo(@"../..");
            if (info.Exists)
            {
                rootNode = new TreeNode(info.Name);
                rootNode.Tag = info;
                GetDirectories(info.GetDirectories(), rootNode);
                treeView1.Nodes.Add(rootNode);
            }
        }

        private void GetDirectories(DirectoryInfo[] subDirs,
            TreeNode nodeToAddTo)
        {
            TreeNode aNode;
            DirectoryInfo[] subSubDirs;
            foreach (DirectoryInfo subDir in subDirs)
            {
                aNode = new TreeNode(subDir.Name, 0, 0);
                aNode.Tag = subDir;
                aNode.ImageKey = "folder";
                subSubDirs = subDir.GetDirectories();
                if (subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                nodeToAddTo.Nodes.Add(aNode);
            }
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode newSelected = e.Node;
            listView1.Items.Clear();
            DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
            ListViewItem.ListViewSubItem[] subItems;
            ListViewItem item = null;

            foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
            {
                item = new ListViewItem(dir.Name, 0);
                subItems = new ListViewItem.ListViewSubItem[]
                    {new ListViewItem.ListViewSubItem(item, "Directory"),
             new ListViewItem.ListViewSubItem(item,
                dir.LastAccessTime.ToShortDateString())};
                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }
            foreach (FileInfo file in nodeDirInfo.GetFiles())
            {
                item = new ListViewItem(file.Name, 1);
                subItems = new ListViewItem.ListViewSubItem[]
                    { new ListViewItem.ListViewSubItem(item, "File"),
             new ListViewItem.ListViewSubItem(item,
                file.LastAccessTime.ToShortDateString())};

                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }

            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
    }
}

======================这里是结束分割线====================

猜你喜欢

转载自blog.csdn.net/dnruanjian/article/details/88798155