using System;
using System.IO;
using System.Resources;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; public class TreeViewCtl : System.Windows.Forms.Form { public TreeViewCtl() {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); FillDirectoryTree();
imageListComboBox.SelectedIndex = 1;
indentUpDown.Value = directoryTree.Indent;
} /// <summary>
/// 清理正在使用的所有资源
/// </summary>
public new void Dispose() {
base.Dispose();
components.Dispose();
} // <doc>
// <desc>
// 对于给定的根目录(或驱动器),向 directoryTree
// 添加目录。
// </desc>
// </doc>
//
private void AddDirectories(TreeNode node) {
try {
DirectoryInfo dir = new DirectoryInfo(GetPathFromNode(node));
DirectoryInfo[] e = dir.GetDirectories(); for (int i = 0; i < e.Length; i++) {
string name = e[i].Name;
if (!name.Equals(".") && !name.Equals("..")) {
node.Nodes.Add(new DirectoryNode(name));
}
}
}
catch (Exception e) {
MessageBox.Show(e.Message);
}
} private void AddSubDirectories(DirectoryNode node) {
for (int i = 0; i < node.Nodes.Count; i++) {
AddDirectories(node.Nodes[i]);
}
node.SubDirectoriesAdded = true;
} private void directoryTree_AfterSelect(object source, TreeViewEventArgs e) {
Text = "Windows.Forms 文件资源管理器 - " + e.Node.Text;
} private void directoryTree_BeforeExpand(object source, TreeViewCancelEventArgs e) {
DirectoryNode nodeExpanding = (DirectoryNode)e.Node;
if (!nodeExpanding.SubDirectoriesAdded)
AddSubDirectories(nodeExpanding);
} private void FillDirectoryTree() {
string[] drives = Environment.GetLogicalDrives();
for (int i = 0; i < drives.Length; i++) {
if (PlatformInvokeKernel32.GetDriveType(drives[i]) == PlatformInvokeKernel32.DRIVE_FIXED) {
DirectoryNode cRoot = new DirectoryNode(drives[i]);
directoryTree.Nodes.Add(cRoot);
AddDirectories(cRoot);
}
}
} private string GetPathFromNode(TreeNode node) {
if (node.Parent == null) {
return node.Text;
}
return Path.Combine(GetPathFromNode(node.Parent), node.Text);
} private int Refresh_GetExpanded(TreeNode Node, string[] ExpandedNodes, int StartIndex) { if (StartIndex < ExpandedNodes.Length) {
if (Node.IsExpanded) {
ExpandedNodes[StartIndex] = Node.Text;
StartIndex++;
for (int i = 0; i < Node.Nodes.Count; i++) {
StartIndex = Refresh_GetExpanded(Node.Nodes[i],
ExpandedNodes,
StartIndex);
}
}
return StartIndex;
}
return -1;
} private void Refresh_Expand(TreeNode Node, string[] ExpandedNodes) { for (int i = ExpandedNodes.Length - 1; i >= 0; i--) {
if (ExpandedNodes[i] == Node.Text) {
/*
* 为了正确显示展开按钮,必须将一级
* 不可见子级添加到目录树。
*/
AddSubDirectories((DirectoryNode) Node);
Node.Expand(); /* 如果展开节点,则展开在刷新前
* 展开的所有子级。
*/
for (int j = 0; j < Node.Nodes.Count; j++) {
Refresh_Expand(Node.Nodes[j], ExpandedNodes);
} return;
}
}
} private void Refresh(TreeNode node) {
// 更新 directoryTree
if (node.Nodes.Count > 0) {
if (node.IsExpanded) {
// 保存所有以 node 为根的展开节点,
// 包括那些间接以 node 为根的节点。
string[] tooBigExpandedNodes = new string[node.GetNodeCount(true)];
int iExpandedNodes = Refresh_GetExpanded(node,
tooBigExpandedNodes,
0);
string[] expandedNodes = new string[iExpandedNodes];
Array.Copy(tooBigExpandedNodes, 0, expandedNodes, 0,
iExpandedNodes); node.Nodes.Clear();
AddDirectories(node); // 因此具有子目录的子级显示为具有展开/折叠
// 按钮。
AddSubDirectories((DirectoryNode)node);
node.Expand(); /*
* 检查所有子级。一些节点可能从外部应用
* 程序添加了子目录,所以以前的无子级节
* 点现在可能有子级。
*/
for (int j = 0; j < node.Nodes.Count ; j++) {
if (node.Nodes[j].Nodes.Count > 0) {
// 如果该子节具有子目录。如果该子级在
// 刷新前是展开的,则在刷新后展开。
Refresh_Expand(node.Nodes[j], expandedNodes);
}
}
} else {
/*
* 如果该节点不是展开的,则不需要检查是否
* 展开了任何子级。但是,应通过读取驱动器
* 来更新目录树,以防外部应用程序添加/移除
* 了任何目录。
*/
node.Nodes.Clear();
AddDirectories(node);
}
} else {
/*
* 再有,如果没有任何子级,则没有必要考虑
* 展开的节点,但如果外部应用程序添加/移除
* 了任何目录,应将其反映出来。
*/
node.Nodes.Clear();
AddDirectories(node);
}
} private void checkBox1_Click(object source, EventArgs e) {
this.directoryTree.Sorted = checkBox1.Checked;
for (int i = 0; i < directoryTree.Nodes.Count; i++) {
Refresh(directoryTree.Nodes[i]);
}
} private void imageListComboBox_SelectedIndexChanged(object source, EventArgs e) {
int index = imageListComboBox.SelectedIndex;
if (index == 0) {
directoryTree.ImageList = null;
} else if (index == 1) {
directoryTree.ImageList = imageList1;
} else {
directoryTree.ImageList = imageList2;
}
} /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
public static void Main(string[] args) {
Application.Run(new TreeViewCtl());
} }
using System.IO;
using System.Resources;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; public class TreeViewCtl : System.Windows.Forms.Form { public TreeViewCtl() {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); FillDirectoryTree();
imageListComboBox.SelectedIndex = 1;
indentUpDown.Value = directoryTree.Indent;
} /// <summary>
/// 清理正在使用的所有资源
/// </summary>
public new void Dispose() {
base.Dispose();
components.Dispose();
} // <doc>
// <desc>
// 对于给定的根目录(或驱动器),向 directoryTree
// 添加目录。
// </desc>
// </doc>
//
private void AddDirectories(TreeNode node) {
try {
DirectoryInfo dir = new DirectoryInfo(GetPathFromNode(node));
DirectoryInfo[] e = dir.GetDirectories(); for (int i = 0; i < e.Length; i++) {
string name = e[i].Name;
if (!name.Equals(".") && !name.Equals("..")) {
node.Nodes.Add(new DirectoryNode(name));
}
}
}
catch (Exception e) {
MessageBox.Show(e.Message);
}
} private void AddSubDirectories(DirectoryNode node) {
for (int i = 0; i < node.Nodes.Count; i++) {
AddDirectories(node.Nodes[i]);
}
node.SubDirectoriesAdded = true;
} private void directoryTree_AfterSelect(object source, TreeViewEventArgs e) {
Text = "Windows.Forms 文件资源管理器 - " + e.Node.Text;
} private void directoryTree_BeforeExpand(object source, TreeViewCancelEventArgs e) {
DirectoryNode nodeExpanding = (DirectoryNode)e.Node;
if (!nodeExpanding.SubDirectoriesAdded)
AddSubDirectories(nodeExpanding);
} private void FillDirectoryTree() {
string[] drives = Environment.GetLogicalDrives();
for (int i = 0; i < drives.Length; i++) {
if (PlatformInvokeKernel32.GetDriveType(drives[i]) == PlatformInvokeKernel32.DRIVE_FIXED) {
DirectoryNode cRoot = new DirectoryNode(drives[i]);
directoryTree.Nodes.Add(cRoot);
AddDirectories(cRoot);
}
}
} private string GetPathFromNode(TreeNode node) {
if (node.Parent == null) {
return node.Text;
}
return Path.Combine(GetPathFromNode(node.Parent), node.Text);
} private int Refresh_GetExpanded(TreeNode Node, string[] ExpandedNodes, int StartIndex) { if (StartIndex < ExpandedNodes.Length) {
if (Node.IsExpanded) {
ExpandedNodes[StartIndex] = Node.Text;
StartIndex++;
for (int i = 0; i < Node.Nodes.Count; i++) {
StartIndex = Refresh_GetExpanded(Node.Nodes[i],
ExpandedNodes,
StartIndex);
}
}
return StartIndex;
}
return -1;
} private void Refresh_Expand(TreeNode Node, string[] ExpandedNodes) { for (int i = ExpandedNodes.Length - 1; i >= 0; i--) {
if (ExpandedNodes[i] == Node.Text) {
/*
* 为了正确显示展开按钮,必须将一级
* 不可见子级添加到目录树。
*/
AddSubDirectories((DirectoryNode) Node);
Node.Expand(); /* 如果展开节点,则展开在刷新前
* 展开的所有子级。
*/
for (int j = 0; j < Node.Nodes.Count; j++) {
Refresh_Expand(Node.Nodes[j], ExpandedNodes);
} return;
}
}
} private void Refresh(TreeNode node) {
// 更新 directoryTree
if (node.Nodes.Count > 0) {
if (node.IsExpanded) {
// 保存所有以 node 为根的展开节点,
// 包括那些间接以 node 为根的节点。
string[] tooBigExpandedNodes = new string[node.GetNodeCount(true)];
int iExpandedNodes = Refresh_GetExpanded(node,
tooBigExpandedNodes,
0);
string[] expandedNodes = new string[iExpandedNodes];
Array.Copy(tooBigExpandedNodes, 0, expandedNodes, 0,
iExpandedNodes); node.Nodes.Clear();
AddDirectories(node); // 因此具有子目录的子级显示为具有展开/折叠
// 按钮。
AddSubDirectories((DirectoryNode)node);
node.Expand(); /*
* 检查所有子级。一些节点可能从外部应用
* 程序添加了子目录,所以以前的无子级节
* 点现在可能有子级。
*/
for (int j = 0; j < node.Nodes.Count ; j++) {
if (node.Nodes[j].Nodes.Count > 0) {
// 如果该子节具有子目录。如果该子级在
// 刷新前是展开的,则在刷新后展开。
Refresh_Expand(node.Nodes[j], expandedNodes);
}
}
} else {
/*
* 如果该节点不是展开的,则不需要检查是否
* 展开了任何子级。但是,应通过读取驱动器
* 来更新目录树,以防外部应用程序添加/移除
* 了任何目录。
*/
node.Nodes.Clear();
AddDirectories(node);
}
} else {
/*
* 再有,如果没有任何子级,则没有必要考虑
* 展开的节点,但如果外部应用程序添加/移除
* 了任何目录,应将其反映出来。
*/
node.Nodes.Clear();
AddDirectories(node);
}
} private void checkBox1_Click(object source, EventArgs e) {
this.directoryTree.Sorted = checkBox1.Checked;
for (int i = 0; i < directoryTree.Nodes.Count; i++) {
Refresh(directoryTree.Nodes[i]);
}
} private void imageListComboBox_SelectedIndexChanged(object source, EventArgs e) {
int index = imageListComboBox.SelectedIndex;
if (index == 0) {
directoryTree.ImageList = null;
} else if (index == 1) {
directoryTree.ImageList = imageList1;
} else {
directoryTree.ImageList = imageList2;
}
} /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
public static void Main(string[] args) {
Application.Run(new TreeViewCtl());
} }
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货