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());
        }    }