知识点: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);
}
}
}
======================这里是结束分割线====================