Csharp/C Sharp/GUI Windows Form/TreeView

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Add Nodes to TreeView

<source lang="csharp"> using System; using System.Drawing; using System.Windows.Forms;

class SimpleTreeView: Form {

    public static void Main()
    {
         Application.Run(new SimpleTreeView());
    }
    public SimpleTreeView()
    {
         Text = "Simple Tree View";
  
         TreeView tree = new TreeView();
         tree.Parent = this;
         tree.Dock = DockStyle.Fill;
  
         tree.Nodes.Add("Animal");
         tree.Nodes[0].Nodes.Add("A");
         tree.Nodes[0].Nodes[0].Nodes.Add("A1");
         tree.Nodes[0].Nodes[0].Nodes.Add("A2");
         tree.Nodes[0].Nodes[0].Nodes.Add("A3");
         tree.Nodes[0].Nodes.Add("B");
         tree.Nodes[0].Nodes[1].Nodes.Add("B1");
         tree.Nodes[0].Nodes[1].Nodes.Add("B2");
         tree.Nodes[0].Nodes.Add("C");
         tree.Nodes[0].Nodes[2].Nodes.Add("C1");
         tree.Nodes[0].Nodes[2].Nodes.Add("C2");
         tree.Nodes[0].Nodes[2].Nodes.Add("C3");
         tree.Nodes.Add("D");
         tree.Nodes[1].Nodes.Add("D1");
         tree.Nodes[1].Nodes.Add("D2");
         tree.Nodes[1].Nodes.Add("D3");
         tree.Nodes.Add("E");
         tree.Nodes[2].Nodes.Add("E1");
         tree.Nodes[2].Nodes.Add("E2");
         tree.Nodes[2].Nodes.Add("E3");
    }

}

</source>


Custom TreeView

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; namespace CustomTreeView {

   /// <summary>
   /// Summary description for Form1.
   /// </summary>
   public class CustomTreeView : System.Windows.Forms.Form
   {
       internal System.Windows.Forms.ImageList imagesTree;
       private ProjectTree tree;
       private System.ruponentModel.IContainer components;
       public CustomTreeView()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if (components != null) 
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           this.ruponents = new System.ruponentModel.Container();

// System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(CustomTreeView));

           this.imagesTree = new System.Windows.Forms.ImageList(this.ruponents);
           this.tree = new ProjectTree();
           this.SuspendLayout();
           // 
           // imagesTree
           // 
           this.imagesTree.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
           this.imagesTree.ImageSize = new System.Drawing.Size(16, 16);

// this.imagesTree.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesTree.ImageStream")));

           this.imagesTree.TransparentColor = System.Drawing.Color.Transparent;
           // 
           // tree
           // 
           this.tree.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
           this.tree.ImageList = this.imagesTree;
           this.tree.Location = new System.Drawing.Point(8, 4);
           this.tree.Name = "tree";
           this.tree.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
                                                                            new System.Windows.Forms.TreeNode("Unassigned", 0, 0),
                                                                            new System.Windows.Forms.TreeNode("In Progress", 1, 1),
                                                                            new System.Windows.Forms.TreeNode("Closed", 2, 2)});
           this.tree.Scrollable = false;
           this.tree.Size = new System.Drawing.Size(320, 296);
           this.tree.TabIndex = 0;
           // 
           // CustomTreeView
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(336, 310);
           this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                         this.tree});
           this.Name = "CustomTreeView";
           this.Text = "ProjectUserTree";
           this.Load += new System.EventHandler(this.Form1_Load);
           this.ResumeLayout(false);
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new CustomTreeView());
       }
       private void Form1_Load(object sender, System.EventArgs e)
       {
           tree.AddProject("Migration to .NET", ProjectTree.StatusType.InProgress);
           tree.AddProject("Revamp pricing site", ProjectTree.StatusType.Unassigned);
           tree.AddProject("Prepare L-DAP feasibility report", ProjectTree.StatusType.Unassigned);
           tree.AddProject("Update E201-G to Windows XP", ProjectTree.StatusType.Closed);
           tree.AddProject("Annual meeting", ProjectTree.StatusType.Closed);
       }
   }


       public class ProjectTree : TreeView
       {
           // Use an enumeration to represent the three types of nodes.
           // Specific numbers correspond to the database field code.
           public enum StatusType
           {
               Unassigned = 101,
               InProgress = 102,
               Closed = 103
           }
           // Store references to the three main node branches.
           private TreeNode nodeUnassigned = new TreeNode("Unassigned", 0, 0);
           private TreeNode nodeInProgress = new TreeNode("In Progress", 1, 1);
           private TreeNode nodeClosed = new TreeNode("Closed", 2, 2);
           // Add the main level of nodes when the control is instantiated.
           public ProjectTree() : base()
           {
               base.Nodes.Add(nodeUnassigned);
               base.Nodes.Add(nodeInProgress);
               base.Nodes.Add(nodeClosed);
           }
           // Provide a specialized method the client can use to add nodes.
           public void AddProject(string name, StatusType status)
           {
               TreeNode nodeNew = new TreeNode(name, 3, 4);
               nodeNew.Tag = status;
               switch (status)
               {
                   case StatusType.Unassigned:
                       nodeUnassigned.Nodes.Add(nodeNew);
                       break;
                   case StatusType.InProgress:
                       nodeInProgress.Nodes.Add(nodeNew);
                       break;
                   case StatusType.Closed:
                       nodeClosed.Nodes.Add(nodeNew);
                       break;
               }
           }
       }
   public class ProjectUserTree : TreeView
   {
       // Use an enumeration to represent the three types of nodes.
       public enum NodeType
       {
           Project,
           User
       }
       // Define a new type of higher-level event for node selection.
       public delegate void ItemSelectEventHandler(object sender,
           ItemSelectEventArgs e);
           public class ItemSelectEventArgs : EventArgs
           {
               public NodeType Type;
               public DataRow ItemData;
           }
       // Define the events that use this signature and event arguments.
       public event ItemSelectEventHandler UserSelect;
       public event ItemSelectEventHandler ProjectSelect;
       
       // Store references to the two main node branches.
       private TreeNode nodeProjects = new TreeNode("Projects", 0, 0);
       private TreeNode nodeUsers = new TreeNode("Users", 1, 1);
       // Add the main level of nodes when the control is instantiated.
       public ProjectUserTree() : base()
       {
           base.Nodes.Add(nodeProjects);
           base.Nodes.Add(nodeUsers);
       }
       // Provide a specialized method the client can use to add projects.
       // Store the corresponding DataRow.
       public void AddProject(DataRow project)
       {
           TreeNode nodeNew = new TreeNode(project["Name"].ToString(), 2, 3);
           nodeNew.Tag = project;
           nodeProjects.Nodes.Add(nodeNew);
       }
       // Provide a specialized method the client can use to add users.
       // Store the correspnding DataRow.
       public void AddUser(DataRow user)
       {
           TreeNode nodeNew = new TreeNode(user["Name"].ToString(), 2, 3);
           nodeNew.Tag = user;
           nodeUsers.Nodes.Add(nodeNew);
       }
       // When a node is selected, retrieve the DataRow and raise the event.
       protected override void OnAfterSelect(TreeViewEventArgs e)
        {
           base.OnAfterSelect(e);
                ItemSelectEventArgs arg = new ItemSelectEventArgs();
                arg.ItemData = (DataRow)e.Node.Tag;
                if (e.Node.Parent == nodeProjects)
                {
                    arg.Type = NodeType.Project;
                    ProjectSelect(this, arg);
                }
                else if (e.Node.Parent == nodeUsers)
                {
                    arg.Type = NodeType.User;
                    UserSelect(this, arg);
                }
            }
   }

}


      </source>


Directory Tree Host

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System.IO; using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; namespace DirectoryTreeHost {

   /// <summary>
   /// Summary description for DirectoryTreeHost.
   /// </summary>
   public class DirectoryTreeHost : System.Windows.Forms.Form
   {
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public DirectoryTreeHost()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if(components != null)
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           // 
           // DirectoryTreeHost
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(292, 266);
           this.Name = "DirectoryTreeHost";
           this.Text = "DirectoryTreeHost";
           this.Load += new System.EventHandler(this.DirectoryTreeHost_Load);
       }
       #endregion
       private void DirectoryTreeHost_Load(object sender, System.EventArgs e)
       {
           DirectoryTree dirTree = new 
               DirectoryTree();
           dirTree.Size = new Size(this.Width - 30, this.Height - 60);
           dirTree.Location = new Point(5, 5);
           dirTree.Drive = Char.Parse("C");
           this.Controls.Add(dirTree);
       }
       public static void Main()
       {
           Application.Run(new DirectoryTreeHost());
       }
   }
   public class DirectoryTree : TreeView
   {
       public delegate void DirectorySelectedDelegate(object sender,
           DirectorySelectedEventArgs e);
       public event DirectorySelectedDelegate DirectorySelected;
       
       private Char drive;
       public Char Drive
       {
           get
           {
               return drive;
           }
           set
           {
               drive = value;
               RefreshDisplay();
           }
       }
       
       // This is public so a Refresh can be triggered manually.
       public void RefreshDisplay()
       {
           // Erase the existing tree.
           this.Nodes.Clear();
           
           // Set the first node.
           TreeNode rootNode = new TreeNode(drive + ":\\");
           this.Nodes.Add(rootNode);
           
           // Fill the first level and expand it.
           Fill(rootNode);
           this.Nodes[0].Expand();
       }
       
       private void Fill(TreeNode dirNode)
       {
           DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath);
           
           // An exception could be thrown in this code if you don"t
           // have sufficient security permissions for a file or directory.
           // You can catch and then ignore this exception.
           
           foreach (DirectoryInfo dirItem in dir.GetDirectories())
           {
               // Add node for the directory.
               TreeNode newNode = new TreeNode(dirItem.Name);
               dirNode.Nodes.Add(newNode);
               newNode.Nodes.Add("*");
           }
       }
       
       protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
       {
           base.OnBeforeExpand(e);
           // If a dummy node is found, remove it and read the real directory list.
           if (e.Node.Nodes[0].Text == "*")
           {
               e.Node.Nodes.Clear();
               Fill(e.Node);
           }
       }
       
       protected override void OnAfterSelect(TreeViewEventArgs e)
       {
           base.OnAfterSelect(e);
           
           // Raise the DirectorySelected event.
           if (DirectorySelected != null)
           {
               DirectorySelected(this,
                   new DirectorySelectedEventArgs(e.Node.FullPath));
           }
       }
   }
   public class DirectorySelectedEventArgs : EventArgs
   {
       public string DirectoryName;
       public DirectorySelectedEventArgs(string directoryName)
       {
           this.DirectoryName = directoryName;
       }
   }

}


      </source>


Drag and drop Tree Node

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

 private System.Windows.Forms.SplitContainer splitContainer1;
 private System.Windows.Forms.TreeView treeOne;
 private System.Windows.Forms.TreeView treeTwo;
 public Form1() {
       InitializeComponent();
   TreeNode node = treeOne.Nodes.Add("A");
   node.Nodes.Add("A1");
   node.Nodes.Add("A2");
   node.Expand();
   node = treeTwo.Nodes.Add("B");
   node.Nodes.Add("B1");
   node.Nodes.Add("B2");
   node.Expand();
   treeTwo.AllowDrop = true;
   treeOne.AllowDrop = true;
 }
 private void tree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
 {
   TreeView tree = (TreeView)sender;
   TreeNode node = tree.GetNodeAt(e.X, e.Y);
   tree.SelectedNode = node;
   if (node != null)
   {
     tree.DoDragDrop(node, DragDropEffects.Copy);
   }
 }
 private void tree_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
 {
   TreeView tree = (TreeView)sender;
   e.Effect = DragDropEffects.None;
   TreeNode nodeSource = (TreeNode)e.Data.GetData(typeof(TreeNode));
   if (nodeSource != null)
   {
     if (nodeSource.TreeView != tree)
     {
       Point pt = new Point(e.X, e.Y);
       pt = tree.PointToClient(pt);
       TreeNode nodeTarget = tree.GetNodeAt(pt);
       if (nodeTarget != null)
       {
         e.Effect = DragDropEffects.Copy;
         tree.SelectedNode = nodeTarget;
       }
     }
   }
 }
 private void tree_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
 {
   TreeView tree = (TreeView)sender;
   Point pt = new Point(e.X, e.Y);
   pt = tree.PointToClient(pt);
   TreeNode nodeTarget = tree.GetNodeAt(pt);
   TreeNode nodeSource = (TreeNode)e.Data.GetData(typeof(TreeNode));
   nodeTarget.Nodes.Add((TreeNode)nodeSource.Clone());
   nodeTarget.Expand();
 }
 private void InitializeComponent()
 {
       this.splitContainer1 = new System.Windows.Forms.SplitContainer();
       this.treeOne = new System.Windows.Forms.TreeView();
       this.treeTwo = new System.Windows.Forms.TreeView();
       this.splitContainer1.Panel1.SuspendLayout();
       this.splitContainer1.Panel2.SuspendLayout();
       this.splitContainer1.SuspendLayout();
       this.SuspendLayout();
       // 
       // splitContainer1
       // 
       this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
       this.splitContainer1.Location = new System.Drawing.Point(0, 0);
       this.splitContainer1.Name = "splitContainer1";
       // 
       // splitContainer1.Panel1
       // 
       this.splitContainer1.Panel1.Controls.Add(this.treeOne);
       // 
       // splitContainer1.Panel2
       // 
       this.splitContainer1.Panel2.Controls.Add(this.treeTwo);
       this.splitContainer1.Size = new System.Drawing.Size(456, 391);
       this.splitContainer1.SplitterDistance = 238;
       this.splitContainer1.TabIndex = 0;
       this.splitContainer1.Text = "splitContainer1";
       // 
       // treeOne
       // 
       this.treeOne.Dock = System.Windows.Forms.DockStyle.Left;
       this.treeOne.HideSelection = false;
       this.treeOne.Location = new System.Drawing.Point(0, 0);
       this.treeOne.Name = "treeOne";
       this.treeOne.Size = new System.Drawing.Size(236, 391);
       this.treeOne.TabIndex = 5;
       this.treeOne.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop);
       this.treeOne.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver);
       this.treeOne.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown);
       // 
       // treeTwo
       // 
       this.treeTwo.Dock = System.Windows.Forms.DockStyle.Fill;
       this.treeTwo.Location = new System.Drawing.Point(0, 0);
       this.treeTwo.Name = "treeTwo";
       this.treeTwo.Size = new System.Drawing.Size(214, 391);
       this.treeTwo.TabIndex = 7;
       this.treeTwo.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop);
       this.treeTwo.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver);
       this.treeTwo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown);
       // 
       // Form1
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(456, 391);
       this.Controls.Add(this.splitContainer1);
       this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
       this.Name = "Form1";
       this.Text = "TreeView Drag-And-Drop";
       this.splitContainer1.Panel1.ResumeLayout(false);
       this.splitContainer1.Panel2.ResumeLayout(false);
       this.splitContainer1.ResumeLayout(false);
       this.ResumeLayout(false);
 }
 [STAThread]
 static void Main()
 {
   Application.EnableVisualStyles();
   Application.Run(new Form1());
 }

}


      </source>


Get Selected Node Full Path

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

 private System.Windows.Forms.SplitContainer splitContainer1;
 private System.Windows.Forms.TreeView treeOne;
 private System.Windows.Forms.TreeView treeTwo;
 public Form1() {
       InitializeComponent();
   TreeNode node = treeOne.Nodes.Add("A");
   node.Nodes.Add("A1");
   node.Nodes.Add("A2");
   node.Expand();
   node = treeTwo.Nodes.Add("B");
   node.Nodes.Add("B1");
   node.Nodes.Add("B2");
   node.Expand();
 }
   private void tree_DoubleClick(object sender, EventArgs e)
   {
      MessageBox.Show(((TreeView)sender).SelectedNode.FullPath);
   }
 private void InitializeComponent()
 {
       this.splitContainer1 = new System.Windows.Forms.SplitContainer();
       this.treeOne = new System.Windows.Forms.TreeView();
       this.treeTwo = new System.Windows.Forms.TreeView();
       this.splitContainer1.Panel1.SuspendLayout();
       this.splitContainer1.Panel2.SuspendLayout();
       this.splitContainer1.SuspendLayout();
       this.SuspendLayout();
       // 
       // splitContainer1
       // 
       this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
       this.splitContainer1.Location = new System.Drawing.Point(0, 0);
       this.splitContainer1.Name = "splitContainer1";
       // 
       // splitContainer1.Panel1
       // 
       this.splitContainer1.Panel1.Controls.Add(this.treeOne);
       // 
       // splitContainer1.Panel2
       // 
       this.splitContainer1.Panel2.Controls.Add(this.treeTwo);
       this.splitContainer1.Size = new System.Drawing.Size(456, 391);
       this.splitContainer1.SplitterDistance = 238;
       this.splitContainer1.TabIndex = 0;
       this.splitContainer1.Text = "splitContainer1";
       // 
       // treeOne
       // 
       this.treeOne.Dock = System.Windows.Forms.DockStyle.Left;
       this.treeOne.HideSelection = false;
       this.treeOne.Location = new System.Drawing.Point(0, 0);
       this.treeOne.Name = "treeOne";
       this.treeOne.Size = new System.Drawing.Size(236, 391);
       this.treeOne.TabIndex = 5;
       this.treeOne.DoubleClick += new System.EventHandler(this.tree_DoubleClick);
       // 
       // treeTwo
       // 
       this.treeTwo.Dock = System.Windows.Forms.DockStyle.Fill;
       this.treeTwo.Location = new System.Drawing.Point(0, 0);
       this.treeTwo.Name = "treeTwo";
       this.treeTwo.Size = new System.Drawing.Size(214, 391);
       this.treeTwo.TabIndex = 7;
       this.treeTwo.DoubleClick += new System.EventHandler(this.tree_DoubleClick);
       // 
       // Form1
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(456, 391);
       this.Controls.Add(this.splitContainer1);
       this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
       this.Name = "Form1";
       this.Text = "TreeView Drag-And-Drop";
       this.splitContainer1.Panel1.ResumeLayout(false);
       this.splitContainer1.Panel2.ResumeLayout(false);
       this.splitContainer1.ResumeLayout(false);
       this.ResumeLayout(false);
 }
 [STAThread]
 static void Main()
 {
   Application.EnableVisualStyles();
   Application.Run(new Form1());
 }

}


      </source>


Read an XML Document and display the file as a Tree

<source lang="csharp"> /* Professional Windows GUI Programming Using C# by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury,

  Zach Greenvoss, Shripad Kulkarni, Neil Whitlow

Publisher: Peer Information ISBN: 1861007663

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; using System.Threading ; using System.Text; using System.IO ; using System.Xml; // // Read an XML Document and display the file as a Tree. // // Shripad Kulkarni // Date : May 15, 2002 // namespace XMLTree {

 /// <summary>
 /// Summary description for XMLTreeForm.
 /// </summary>
 public class XMLTreeForm : System.Windows.Forms.Form
 {
   private System.Windows.Forms.MainMenu mainMenu1;
   private System.Windows.Forms.MenuItem menuItem1;
   private System.Windows.Forms.MenuItem menuItem2;
   private System.Windows.Forms.MenuItem menuItem3;
   private System.Windows.Forms.OpenFileDialog openFileDialog1;
   /// <summary>
   /// Required designer variable.
   /// </summary>
   private System.ruponentModel.Container components = null;
   enum VIEW { TREE_VIEW =0} ; 
   string XMLInputFile        = null;
   string FileSize          = "";
   string WorkingDir        = Directory.GetCurrentDirectory(); 
   string OrigFormTitle      = "";
   bool bFileLoaded        = false ;
   int CurrentView          = (int)VIEW.TREE_VIEW ;
   Object NodeTag          = null ;
   Thread t            = null ; 
   TreeNode RootNode        = null ; 
   Point ClickedPoint        = new Point(0,0);
   ArrayList TreeNodeArray      = new ArrayList();
   ImageList tr_il          = new ImageList();
   ImageList tb_il          = new ImageList();
   Bitmap img_fileopen , img_exit , img_collapse , img_expand , img_about;
   
   private System.Windows.Forms.MenuItem menuItem4;
   private System.Windows.Forms.MenuItem menuItem5;
   private System.Windows.Forms.ToolBar toolBar1;
   private System.Windows.Forms.TreeView treeView1;
   private System.Windows.Forms.ToolBarButton Open;
   private System.Windows.Forms.ToolBarButton Exit;
   private System.Windows.Forms.ToolBarButton About;
   private System.Windows.Forms.ToolBarButton SEPARATOR1;
   private System.Windows.Forms.ToolBarButton ExpandAll;
   private System.Windows.Forms.ToolBarButton CollapseAll;
   private System.Windows.Forms.ToolBarButton Stop;
   private System.Windows.Forms.ToolBarButton SEPARATOR2;
   private System.Windows.Forms.ListBox listBox1;
   private System.Windows.Forms.Splitter splitter1;
   private System.Windows.Forms.ToolBarButton SEPARATOR3;
   delegate void MyDelegate();
   public XMLTreeForm()
   {
     InitializeComponent();
   }
   /// <summary>
   /// Clean up any resources being used.
   /// </summary>
   protected override void Dispose( bool disposing )
   {
     if( disposing )
     {
       if (components != null) 
       {
         components.Dispose();
       }
     }
     base.Dispose( disposing );
   }
   #region Windows Form Designer generated code
   /// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   private void InitializeComponent()
   {
     this.mainMenu1 = new System.Windows.Forms.MainMenu();
     this.menuItem1 = new System.Windows.Forms.MenuItem();
     this.menuItem3 = new System.Windows.Forms.MenuItem();
     this.menuItem2 = new System.Windows.Forms.MenuItem();
     this.menuItem4 = new System.Windows.Forms.MenuItem();
     this.menuItem5 = new System.Windows.Forms.MenuItem();
     this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
     this.toolBar1 = new System.Windows.Forms.ToolBar();
     this.Open = new System.Windows.Forms.ToolBarButton();
     this.SEPARATOR1 = new System.Windows.Forms.ToolBarButton();
     this.ExpandAll = new System.Windows.Forms.ToolBarButton();
     this.CollapseAll = new System.Windows.Forms.ToolBarButton();
     this.Stop = new System.Windows.Forms.ToolBarButton();
     this.SEPARATOR3 = new System.Windows.Forms.ToolBarButton();
     this.Exit = new System.Windows.Forms.ToolBarButton();
     this.About = new System.Windows.Forms.ToolBarButton();
     this.SEPARATOR2 = new System.Windows.Forms.ToolBarButton();
     this.treeView1 = new System.Windows.Forms.TreeView();
     this.listBox1 = new System.Windows.Forms.ListBox();
     this.splitter1 = new System.Windows.Forms.Splitter();
     this.SuspendLayout();
     // 
     // mainMenu1
     // 
     this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                           this.menuItem1,
                                           this.menuItem4});
     // 
     // menuItem1
     // 
     this.menuItem1.Index = 0;
     this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                           this.menuItem3,
                                           this.menuItem2});
     this.menuItem1.OwnerDraw = true;
     this.menuItem1.Text = "File";
     this.menuItem1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem1_DrawItem);
     this.menuItem1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem1_MeasureItem);
     // 
     // menuItem3
     // 
     this.menuItem3.Index = 0;
     this.menuItem3.OwnerDraw = true;
     this.menuItem3.Text = "Open";
     this.menuItem3.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem3_DrawItem);
     this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click);
     this.menuItem3.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem3_MeasureItem);
     // 
     // menuItem2
     // 
     this.menuItem2.Index = 1;
     this.menuItem2.OwnerDraw = true;
     this.menuItem2.Text = "Exit";
     this.menuItem2.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem3_DrawItem);
     this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
     this.menuItem2.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem3_MeasureItem);
     // 
     // menuItem4
     // 
     this.menuItem4.Index = 1;
     this.menuItem4.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                           this.menuItem5});
     this.menuItem4.OwnerDraw = true;
     this.menuItem4.Text = "Help";
     this.menuItem4.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem1_DrawItem);
     this.menuItem4.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem1_MeasureItem);
     // 
     // menuItem5
     // 
     this.menuItem5.Index = 0;
     this.menuItem5.OwnerDraw = true;
     this.menuItem5.Text = "About";
     this.menuItem5.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem3_DrawItem);
     this.menuItem5.Click += new System.EventHandler(this.menuItem5_Click);
     this.menuItem5.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem3_MeasureItem);
     // 
     // openFileDialog1
     // 
     this.openFileDialog1.Filter = "XML FILES| *.xml";
     this.openFileDialog1.FileOk += new System.ruponentModel.CancelEventHandler(this.openFileDialog1_FileOk);
     // 
     // toolBar1
     // 
     this.toolBar1.Appearance = System.Windows.Forms.ToolBarAppearance.Flat;
     this.toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
                                           this.Open,
                                           this.SEPARATOR1,
                                           this.ExpandAll,
                                           this.CollapseAll,
                                           this.Stop,
                                           this.SEPARATOR3,
                                           this.Exit,
                                           this.About,
                                           this.SEPARATOR2});
     this.toolBar1.ButtonSize = new System.Drawing.Size(16, 16);
     this.toolBar1.Cursor = System.Windows.Forms.Cursors.Hand;
     this.toolBar1.DropDownArrows = true;
     this.toolBar1.Name = "toolBar1";
     this.toolBar1.ShowToolTips = true;
     this.toolBar1.Size = new System.Drawing.Size(840, 25);
     this.toolBar1.TabIndex = 0;
     this.toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick);
     // 
     // Open
     // 
     this.Open.ImageIndex = 0;
     this.Open.ToolTipText = "Open XML File";
     // 
     // SEPARATOR1
     // 
     this.SEPARATOR1.Style = System.Windows.Forms.ToolBarButtonStyle.Separator;
     // 
     // ExpandAll
     // 
     this.ExpandAll.Enabled = false;
     this.ExpandAll.ImageIndex = 3;
     this.ExpandAll.ToolTipText = "Expand All Nodes";
     // 
     // CollapseAll
     // 
     this.CollapseAll.Enabled = false;
     this.CollapseAll.ImageIndex = 4;
     this.CollapseAll.ToolTipText = "Collapse All Nodes";
     // 
     // Stop
     // 
     this.Stop.Enabled = false;
     this.Stop.ImageIndex = 5;
     this.Stop.ToolTipText = "Stop";
     // 
     // SEPARATOR3
     // 
     this.SEPARATOR3.Style = System.Windows.Forms.ToolBarButtonStyle.Separator;
     // 
     // Exit
     // 
     this.Exit.ImageIndex = 1;
     this.Exit.ToolTipText = "Exit Application";
     // 
     // About
     // 
     this.About.ImageIndex = 2;
     this.About.ToolTipText = "Help About";
     // 
     // SEPARATOR2
     // 
     this.SEPARATOR2.Style = System.Windows.Forms.ToolBarButtonStyle.Separator;
     // 
     // treeView1
     // 
     this.treeView1.BackColor = System.Drawing.Color.White;
     this.treeView1.Cursor = System.Windows.Forms.Cursors.Hand;
     this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;
     this.treeView1.Font = new System.Drawing.Font("Verdana", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
     this.treeView1.FullRowSelect = true;
     this.treeView1.HotTracking = true;
     this.treeView1.ImageIndex = -1;
     this.treeView1.ItemHeight = 16;
     this.treeView1.Location = new System.Drawing.Point(0, 25);
     this.treeView1.Name = "treeView1";
     this.treeView1.SelectedImageIndex = -1;
     this.treeView1.Size = new System.Drawing.Size(360, 472);
     this.treeView1.TabIndex = 3;
     this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
     // 
     // listBox1
     // 
     this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
     this.listBox1.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
     this.listBox1.ForeColor = System.Drawing.Color.Maroon;
     this.listBox1.HorizontalScrollbar = true;
     this.listBox1.ItemHeight = 16;
     this.listBox1.Location = new System.Drawing.Point(368, 25);
     this.listBox1.Name = "listBox1";
     this.listBox1.ScrollAlwaysVisible = true;
     this.listBox1.Size = new System.Drawing.Size(472, 468);
     this.listBox1.TabIndex = 12;
     // 
     // splitter1
     // 
     this.splitter1.Location = new System.Drawing.Point(360, 25);
     this.splitter1.Name = "splitter1";
     this.splitter1.Size = new System.Drawing.Size(8, 472);
     this.splitter1.TabIndex = 11;
     this.splitter1.TabStop = false;
     // 
     // XMLTreeForm
     // 
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(840, 497);
     this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                     this.listBox1,
                                     this.splitter1,
                                     this.treeView1,
                                     this.toolBar1});
     this.Menu = this.mainMenu1;
     this.Name = "XMLTreeForm";
     this.Text = "XML Viewer";
     this.Resize += new System.EventHandler(this.XMLTreeForm_Resize);
     this.Load += new System.EventHandler(this.XMLTreeForm_Load);
     this.ResumeLayout(false);
   }
   #endregion
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
   static void Main() 
   {
     Application.Run(new XMLTreeForm());
   }
   private void XMLTreeForm_Load(object sender, System.EventArgs e)
   {
     // Add images to the imageList for treeView
     tr_il.Images.Add(new Icon(WorkingDir+ "\\ROOT.ICO"));    //ROOT    0
     tr_il.Images.Add(new Icon(WorkingDir+ "\\ELEMENT.ICO"));  //ELEMENT  1
     tr_il.Images.Add(new Icon(WorkingDir+ "\\EQUAL.ICO"));    //ATTRIBUTE  2
     treeView1.ImageList = tr_il; 
     // Add images to the imageList for Toolbar
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\FileOpen.bmp"));    //ROOT    0
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\exit.bmp"));      //ELEMENT  1
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\about.bmp"));    //ATTRIBUTE  2
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\ExpandTree.bmp"));  //ATTRIBUTE  3
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\CollapseTree.bmp"));  //ATTRIBUTE  4
     tb_il.Images.Add(new Bitmap(WorkingDir+ "\\Stop.bmp"));      //ATTRIBUTE  5
     toolBar1.ImageList = tb_il; 
     // Add images to the imageList for the MenuBar
     img_fileopen  = new Bitmap("FileOpen.bmp"); 
     img_exit    = new Bitmap("exit.bmp"); 
     img_expand    = new Bitmap("ExpandTree.bmp");
     img_collapse  = new Bitmap("CollapseTree.bmp");
     img_about    = new Bitmap("about.bmp"); 
     OrigFormTitle  = this.Text ; 
   }
   private void menuItem3_Click(object sender, System.EventArgs e)
   {
     openFileDialog1.ShowDialog(this);
   }
   private void openFileDialog1_FileOk(object sender, System.ruponentModel.CancelEventArgs e)
   {
     // Initialize Buttons
     EnableDisableControls() ;
     // Initialize All the Arrays
     treeView1.Nodes.Clear() ;
     listBox1.Items.Clear() ;
     TreeNodeArray.Clear();
     bFileLoaded = false ;
     XMLInputFile  = openFileDialog1.FileName ;
     this.Text    = OrigFormTitle + " ..." + XMLInputFile ; 
     openFileDialog1.Dispose() ;
     
     // Get the filename and filesize
     FileInfo f    = new FileInfo(XMLInputFile);
     FileSize    = f.Length.ToString();
     // Begin thread to read input file and load into the ListBox
     Thread t    = new Thread(new ThreadStart(PopulateList));
     t.Start();
     // Begin thread to read input file and populate the Tree
     Thread tt    = new Thread(new ThreadStart(PopulateTree));
     tt.Start();
   }
   private void PopulateList()
   {
     // Load the File
     LoadFileIntoListBox();
   }
 
   private void PopulateTree()
   {
     // TreeView Nodes cannot be added in a thread , until the thread is marshalled
     // using an Invoke or beginInvoke call.
     // We create a delegate ( Funtion Pointer ) and invoke the thread using he delegate
     MyDelegate dlg_obj ;
     dlg_obj = new MyDelegate(ParseFile);  
     treeView1.Invoke(dlg_obj);
   }
   private void ParseFile()
   {
     // Use the XMLReader class to read the XML File and populate the
     // treeview
     try
     {
       XmlTextReader reader    = null;
       reader            = new XmlTextReader(XMLInputFile);
       reader.WhitespaceHandling  = WhitespaceHandling.None;
       string readerName      = "" ;
       bool start_node        = false ;
       int depth          = 0;
       TreeNode WORKINGNODE    = null ; 
       RootNode          = null ; 
       TreeNode AttrNode      = null ;
       TreeNode newNode      = null ;
       bool bIsEmpty        = false ;
       while (reader.Read())
       {
              switch (reader.NodeType)
         {
           case XmlNodeType.Element:
             readerName  = reader.Name;
             bIsEmpty  = reader.IsEmptyElement;
             if ( ! start_node ) 
             { 
               start_node          = true ;
               RootNode          = this.treeView1.Nodes.Add(readerName);
               AssociateTag(RootNode , reader.LineNumber);
               RootNode.SelectedImageIndex  = 0 ;
               RootNode.ImageIndex      = 0 ;
               continue ; 
             }           
             depth = reader.Depth ; 
             if ( reader.IsStartElement() && depth == 1  ) 
             {
               WORKINGNODE = RootNode.Nodes.Add(reader.Name);
               AssociateTag(WORKINGNODE, reader.LineNumber);
             }
             else
             {
               TreeNode parent = WORKINGNODE;
               WORKINGNODE    = parent.Nodes.Add(reader.Name);
               AssociateTag(WORKINGNODE, reader.LineNumber);
             }
             WORKINGNODE.SelectedImageIndex= 1 ;
             WORKINGNODE.ImageIndex= 1 ;
             for (int i = 0; i < reader.AttributeCount; i++)
             {
               reader.MoveToAttribute(i);
               string rValue  = reader.Value.Replace("\r\n", " ");
               AttrNode    = WORKINGNODE.Nodes.Add(reader.Name);

// AttrNode = WORKINGNODE.Nodes.Add(reader.Name +"="+rValue);

               AssociateTag(AttrNode, reader.LineNumber);
               AttrNode.SelectedImageIndex  = 1 ;
               AttrNode.ImageIndex      = 1 ;
               TreeNode tmp        = AttrNode.Nodes.Add(rValue);
               tmp.SelectedImageIndex    = 2 ;
               tmp.ImageIndex        = 2 ;
               AssociateTag(tmp, reader.LineNumber);
               AttrNode.SelectedImageIndex  = 2 ;
               AttrNode.ImageIndex      = 2 ;
             }
             if ( bIsEmpty ) 
               WORKINGNODE = WORKINGNODE.Parent ; 
             
             break;
           case XmlNodeType.Text:
           {
             string rValue        = reader.Value.Replace("\r\n" , " ");
             newNode            = WORKINGNODE.Nodes.Add(rValue);
             AssociateTag(newNode, reader.LineNumber);
             newNode.SelectedImageIndex  = 2 ;
             newNode.ImageIndex      = 2 ;
           }
             break;
           case XmlNodeType.EndElement:
             WORKINGNODE          = WORKINGNODE.Parent ; 
             break;
         }       
           }           
       reader.Close();
       RootNode.Expand();
     }
     catch(Exception  eee) 
     {
       Console.WriteLine(eee.Message);
     }
   }
   private void treeView1_Click(object sender, System.EventArgs  e)
   {  
   }
   private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
   {
     if ( ! bFileLoaded ) return ; 
     // The treenode is selected. Every node is tagged with LineNumber ( from input file ).
     // This allows us to jump to the line in the file.
     TreeNode tn;
     tn      = (TreeNode)e.Node;
     Object ln  = tn.Tag ; 
     int line  = Convert.ToInt32(ln.ToString());
     MoveToLine(line);
   }
   private void menuItem2_Click(object sender, System.EventArgs e)
   {
     AppExit();
   }
   private void AppExit()
   {
     Application.Exit() ;
   }
   private void LoadFileIntoListBox()
   {
     // Load the xml file into a listbox.
     try
     {
           StreamReader sr = new StreamReader(XMLInputFile, Encoding.ASCII);
       sr.BaseStream.Seek(0, SeekOrigin.Begin);
       while (sr.Peek() > -1) 
       {
              Thread.Sleep(5);
              string str = sr.ReadLine();
         listBox1.Items.Add(str);
       }
       sr.Close();
       bFileLoaded = true ;
       listBox1.SetSelected(1 , true);
     }
     catch(Exception ee)
     {
       Console.WriteLine("Error Reading File into ListBox " + ee.Message);
     }
   }
   private void MoveToLine(int ln)
   {
     // Select the input line from the file in the listbox
     listBox1.SetSelected(ln-1 , true);
   }
   private void AssociateTag(TreeNode t , int l)
   {
     // Associate a line number Tag with every node in the tree
     NodeTag = new Object();
     NodeTag = l ; 
     t.Tag  = NodeTag ; 
   }
   private void menuItem5_Click(object sender, System.EventArgs e)
   {
     // About Box is clicked
     ShowAboutBox();
   }
   private void ShowAboutBox()
   {
     About abt = new About() ;
     abt.ShowDialog() ;
   }
   
   private void EnableDisableControls()
   {
     // Enable Disable Buttons
     switch ( CurrentView ) 
     {
       case 0 :  // TREE VIEW
       {
         ExpandAll.Enabled  = true;
         CollapseAll.Enabled = true;
         Stop.Enabled    = true ;
         treeView1.Visible  = true;
       }
       break ;
       case 1 :  // REPORT VIEW
       {
         ExpandAll.Enabled  = false ;
         CollapseAll.Enabled = false ;
         Stop.Enabled    = false ;
       }
       break ;
     }
   }
   private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
   {
     // Invoke the function upon clicking the toolbar button
     int x = int.Parse(toolBar1.Buttons.IndexOf(e.Button).ToString());
     switch(toolBar1.Buttons.IndexOf(e.Button))
     {
       case 0:
         openFileDialog1.ShowDialog(this);
         break; 
       case 1:   
         //separator
         break; 
       case 2:
         TExpandAll() ;
         break; 
       case 3:
         TCollapseAll();          
         break; 
       case 4:
         if ( t != null && t.IsAlive ) 
         {
           t.Abort() ;
           t = null ; 
           EnableDisableControls();
         }
         break; 
       case 5:
         break; 
       case 6:
         AppExit();
         break; 
       case 7:
         ShowAboutBox();
         break; 
       case 8:  // separator
         //separator
         break; 
       case 9:  // Go Back 
         break; 
       case 10:// separator
         break; 
       case 11:// Go Back 
         CurrentView = (int)VIEW.TREE_VIEW ;
         EnableDisableControls();
         break; 
     }
   }
   private void TExpandAll()
   {
     t = new Thread(new ThreadStart(TE));
     t.Start();
   }
   
   private void TE()
   {
     // Expand all nodes in the tree
     treeView1.ExpandAll() ;
   }
   private void TCollapseAll()
   {
     // Collapse all nodes in the tree
     treeView1.CollapseAll() ;
   }
   void Clear()
   {
     TreeNodeArray.Clear();
   }
   private void menuItem1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
   {  
     //Owner Draw Menu Items
     //Get the bounding rectangle
     Rectangle rc = new Rectangle(e.Bounds.X+1 , e.Bounds.Y+1, e.Bounds.Width-5, e.Bounds.Height-1);
     //Fill the rectangle
     e.Graphics.FillRectangle(new SolidBrush(Color.LightGray) , rc);
     //Unbox the menu item
     MenuItem s = (MenuItem)sender ;
     string s1 = s.Text ;
     //Set the stringformat object
     StringFormat sf = new StringFormat();
     sf.Alignment = StringAlignment.Center ;
     e.Graphics.DrawString(s1 , new Font("Ariel" ,10), new SolidBrush(Color.Black) , rc , sf );
     Console.WriteLine(e.State.ToString());
     //Check if the object is selected. 
     if ( e.State ==  (DrawItemState.NoAccelerator | DrawItemState.Selected)  ||  
       e.State ==  ( DrawItemState.NoAccelerator | DrawItemState.HotLight)  ) 
     {
       // Draw selected menu item
       e.Graphics.FillRectangle(new SolidBrush(Color.LightYellow) , rc);
       e.Graphics.DrawString( s1 , new Font("Veranda" , 10 , FontStyle.Bold  ) , new SolidBrush(Color.Red), rc ,sf);
       e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rc );
     }
     e.DrawFocusRectangle();
     e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1 ), rc );
   }
   private void menuItem1_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
   {
     // Set the menu item height
     e.ItemWidth = 75 ;  
   }
   private void menuItem3_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
   {
     // Set the sub menu item height and width
     e.ItemWidth = 95 ;
     e.ItemHeight = 25 ;    
   }
   private void menuItem3_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
   {
     //Owner Draw Sub Menu Items
     Rectangle rc = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
     e.Graphics.FillRectangle(new SolidBrush(Color.LightGray) , rc);
     MenuItem s = (MenuItem)sender ;
     string s1 = s.Text ;
     StringFormat sf = new StringFormat();
     sf.Alignment = StringAlignment.Far ;
     sf.LineAlignment  = StringAlignment.Center;
     Image useImage = null ;
     if ( s1 == "Open" ) 
     {
       useImage = img_fileopen;
     }
     if ( s1 == "ExpandAll" )
     {
       if ( CurrentView == (int)VIEW.TREE_VIEW ) 
         s.Enabled = true;
       else
         s.Enabled = false ;
       useImage = img_expand;
     }
     if ( s1 == "Exit" )
     {
       useImage = img_exit;
     }
     if ( s1 == "CollapseAll" )
     {
       if ( CurrentView == (int)VIEW.TREE_VIEW ) 
         s.Enabled = true;
       else
         s.Enabled = false ;
       useImage = img_collapse;
     }
     if ( s1 == "About" )
     {
       useImage = img_about;
     }
     Rectangle rcText = rc ;
     rcText.Width-=5 ;
     e.Graphics.DrawString(s1 , new Font("Veranda" ,10), new SolidBrush(Color.Blue) , rcText, sf );
     e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.LightGray)), rc );
     if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.Selected)) 
     {
       Rectangle rc1= rc ;
       rc1.X = rc1.X + useImage.Width + 5 ;
       rc1.Width = rc.Width - 25 ;
       rc1.Height = rc.Height- 2 ;
       e.Graphics.FillRectangle(new SolidBrush(Color.LightYellow) , rc);
       e.Graphics.DrawString( s1 , new Font("Veranda" , 10 , FontStyle.Bold | FontStyle.Underline) , new SolidBrush(Color.Red), rcText,sf);
       e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black),3), rc );
       e.DrawFocusRectangle();
     }
     if ( useImage != null ) 
     {
       SizeF sz = useImage.PhysicalDimension;
       e.Graphics.DrawImage(useImage, e.Bounds.X+5 , ( e.Bounds.Bottom + e.Bounds.Top ) /2 - sz.Height/2);
     }  
   }
   private void XMLTreeForm_Resize(object sender, System.EventArgs e)
   {
   }
 }

}


      </source>

<A href="http://www.nfex.ru/Code/CSharpDownload/XMLTree.zip">XMLTree.zip( 85 k)</a>


Recursively load Directory info into TreeView

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; public class Form1 : Form {

     private System.Windows.Forms.TreeView directoryTreeView;
    
     string substringDirectory;
      
     public Form1() {
       InitializeComponent();
       directoryTreeView.Nodes.Clear();
       
       String path = "c:\\Temp";
       directoryTreeView.Nodes.Add( path );
       PopulateTreeView(path, directoryTreeView.Nodes[ 0 ] );
     }  
     public void PopulateTreeView(string directoryValue, TreeNode parentNode )
     {
         string[] directoryArray = 
          Directory.GetDirectories( directoryValue );
         try
         {
            if ( directoryArray.Length != 0 )
            {
               foreach ( string directory in directoryArray )
               {
                 substringDirectory = directory.Substring(
                 directory.LastIndexOf( "\\" ) + 1,
                 directory.Length - directory.LastIndexOf( "\\" ) - 1 );
                 TreeNode myNode = new TreeNode( substringDirectory );
                 parentNode.Nodes.Add( myNode );
                 PopulateTreeView( directory, myNode );
              }
            }
         } catch ( UnauthorizedAccessException ) {
           parentNode.Nodes.Add( "Access denied" );
         } // end catch
     }
     private void InitializeComponent()
     {
        this.directoryTreeView = new System.Windows.Forms.TreeView();
        this.SuspendLayout();
        // 
        // directoryTreeView
        // 
        this.directoryTreeView.Location = new System.Drawing.Point(12, 77);
        this.directoryTreeView.Name = "directoryTreeView";
        this.directoryTreeView.Size = new System.Drawing.Size(284, 265);
        this.directoryTreeView.TabIndex = 0;
        // 
        // TreeViewDirectoryStructureForm
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(304, 354);
        this.Controls.Add(this.directoryTreeView);
        this.Name = "TreeViewDirectoryStructureForm";
        this.Text = "TreeViewDirectoryStructure";
        this.ResumeLayout(false);
        this.PerformLayout();
     }
 [STAThread]
 static void Main()
 {
   Application.EnableVisualStyles();
   Application.Run(new Form1());
 }

}


      </source>


Subclass TreeView

<source lang="csharp"> using System; using System.Drawing; using System.IO; using System.Windows.Forms;

class DirectoryTreeView: TreeView {

    public DirectoryTreeView()
    {
         ImageList = new ImageList();
         ImageList.Images.Add(new Bitmap(GetType(), "FLOPPY.BMP"));
         ImageList.Images.Add(new Bitmap(GetType(), "FOLD.BMP"));
         ImageList.Images.Add(new Bitmap(GetType(), "OPENFOLD.BMP"));
         RefreshTree();
    }
    public void RefreshTree()
    {
         BeginUpdate();
         Nodes.Clear();
         string[] astrDrives = Directory.GetLogicalDrives();
  
         foreach (string str in astrDrives)
         {
              TreeNode tnDrive = new TreeNode(str, 0, 0);
              Nodes.Add(tnDrive);
              AddDirectories(tnDrive);
  
              if (str == "C:\\")
                   SelectedNode = tnDrive;
         }
         EndUpdate();
    }
    void AddDirectories(TreeNode tn)
    {
         tn.Nodes.Clear();
  
         string          strPath = tn.FullPath;
         DirectoryInfo   dirinfo = new DirectoryInfo(strPath);
         DirectoryInfo[] adirinfo;
  
         adirinfo = dirinfo.GetDirectories();
  
         foreach (DirectoryInfo di in adirinfo)
         {
              TreeNode tnDir = new TreeNode(di.Name, 1, 2);
              tn.Nodes.Add(tnDir);
         }
    }
    protected override void OnBeforeExpand(TreeViewCancelEventArgs tvcea)
    {
         base.OnBeforeExpand(tvcea);
  
         BeginUpdate();
  
         foreach (TreeNode tn in tvcea.Node.Nodes)
              AddDirectories(tn);
  
         EndUpdate();
    }

} class DirectoriesAndFiles: Form {

    DirectoryTreeView dirtree;
    Panel             panel;
    TreeNode          tnSelect;
  
    public static void Main()
    {
         Application.Run(new DirectoriesAndFiles());
    }
    public DirectoriesAndFiles()
    {
         Text = "Directories and Files";
         BackColor = SystemColors.Window;
         ForeColor = SystemColors.WindowText;
  
         panel = new Panel();
         panel.Parent = this;
         panel.Dock = DockStyle.Fill;
         panel.Paint += new PaintEventHandler(PanelOnPaint);
  
         Splitter split = new Splitter();
         split.Parent = this;
         split.Dock = DockStyle.Left;
         split.BackColor = SystemColors.Control;
  
         dirtree = new DirectoryTreeView();
         dirtree.Parent = this;
         dirtree.Dock = DockStyle.Left;
         dirtree.AfterSelect += new TreeViewEventHandler(DirectoryTreeViewOnAfterSelect);
  
         Menu = new MainMenu();
         Menu.MenuItems.Add("View");
  
         MenuItem mi = new MenuItem("Refresh", new EventHandler(MenuOnRefresh), Shortcut.F5);
         Menu.MenuItems[0].MenuItems.Add(mi);
    }
    void DirectoryTreeViewOnAfterSelect(object obj, TreeViewEventArgs tvea)
    {
         tnSelect = tvea.Node;
         panel.Invalidate();
    }
    void PanelOnPaint(object obj, PaintEventArgs pea)
    {
         if (tnSelect == null)
              return;
  
         Panel         panel     = (Panel) obj;
         Graphics      grfx      = pea.Graphics;
         DirectoryInfo dirinfo   = new DirectoryInfo(tnSelect.FullPath);
         FileInfo[]    afileinfo;
         Brush         brush     = new SolidBrush(panel.ForeColor);
         int           y         = 0;
  
         afileinfo = dirinfo.GetFiles();
         foreach (FileInfo fileinfo in afileinfo)
         {
              grfx.DrawString(fileinfo.Name, Font, brush, 0, y);
              y += Font.Height;
         }
    }
    void MenuOnRefresh(object obj, EventArgs ea)
    {
         dirtree.RefreshTree();
    }

}

</source>


TreeView Data Binding

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; namespace TreeViewDataBinding {

 /// <summary>
 /// Summary description for TreeViewDataBinding.
 /// </summary>
 public class TreeViewDataBinding : System.Windows.Forms.Form
 {
   internal System.Windows.Forms.Panel Panel2;
   internal System.Windows.Forms.Panel Panel3;
   internal System.Windows.Forms.Label lblInfo;
   internal System.Windows.Forms.Label Label1;
   internal System.Windows.Forms.Splitter Splitter1;
   internal System.Windows.Forms.TreeView treeDB;
   internal System.Windows.Forms.Panel Panel1;
   internal System.Windows.Forms.Button cmdClose;
   internal System.Windows.Forms.GroupBox GroupBox1;
   /// <summary>
   /// Required designer variable.
   /// </summary>
   private System.ruponentModel.Container components = null;
   public TreeViewDataBinding()
   {
     //
     // Required for Windows Form Designer support
     //
     InitializeComponent();
     //
     // TODO: Add any constructor code after InitializeComponent call
     //
   }
   /// <summary>
   /// Clean up any resources being used.
   /// </summary>
   protected override void Dispose( bool disposing )
   {
     if( disposing )
     {
       if (components != null) 
       {
         components.Dispose();
       }
     }
     base.Dispose( disposing );
   }
   #region Windows Form Designer generated code
   /// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   private void InitializeComponent()
   {
     this.Panel2 = new System.Windows.Forms.Panel();
     this.Panel3 = new System.Windows.Forms.Panel();
     this.lblInfo = new System.Windows.Forms.Label();
     this.Label1 = new System.Windows.Forms.Label();
     this.Splitter1 = new System.Windows.Forms.Splitter();
     this.treeDB = new System.Windows.Forms.TreeView();
     this.Panel1 = new System.Windows.Forms.Panel();
     this.cmdClose = new System.Windows.Forms.Button();
     this.GroupBox1 = new System.Windows.Forms.GroupBox();
     this.Panel2.SuspendLayout();
     this.Panel3.SuspendLayout();
     this.Panel1.SuspendLayout();
     this.SuspendLayout();
     // 
     // Panel2
     // 
     this.Panel2.Controls.AddRange(new System.Windows.Forms.Control[] {
                                        this.Panel3,
                                        this.Splitter1,
                                        this.treeDB});
     this.Panel2.Dock = System.Windows.Forms.DockStyle.Fill;
     this.Panel2.Location = new System.Drawing.Point(5, 5);
     this.Panel2.Name = "Panel2";
     this.Panel2.Size = new System.Drawing.Size(446, 264);
     this.Panel2.TabIndex = 8;
     // 
     // Panel3
     // 
     this.Panel3.Controls.AddRange(new System.Windows.Forms.Control[] {
                                        this.lblInfo,
                                        this.Label1});
     this.Panel3.Dock = System.Windows.Forms.DockStyle.Fill;
     this.Panel3.Location = new System.Drawing.Point(239, 0);
     this.Panel3.Name = "Panel3";
     this.Panel3.Size = new System.Drawing.Size(207, 264);
     this.Panel3.TabIndex = 7;
     // 
     // lblInfo
     // 
     this.lblInfo.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
       | System.Windows.Forms.AnchorStyles.Left) 
       | System.Windows.Forms.AnchorStyles.Right);
     this.lblInfo.BackColor = System.Drawing.SystemColors.Window;
     this.lblInfo.Location = new System.Drawing.Point(16, 12);
     this.lblInfo.Name = "lblInfo";
     this.lblInfo.Size = new System.Drawing.Size(176, 240);
     this.lblInfo.TabIndex = 1;
     // 
     // Label1
     // 
     this.Label1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
       | System.Windows.Forms.AnchorStyles.Left) 
       | System.Windows.Forms.AnchorStyles.Right);
     this.Label1.BackColor = System.Drawing.SystemColors.Window;
     this.Label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
     this.Label1.Location = new System.Drawing.Point(4, 0);
     this.Label1.Name = "Label1";
     this.Label1.Size = new System.Drawing.Size(200, 264);
     this.Label1.TabIndex = 2;
     // 
     // Splitter1
     // 
     this.Splitter1.Location = new System.Drawing.Point(236, 0);
     this.Splitter1.Name = "Splitter1";
     this.Splitter1.Size = new System.Drawing.Size(3, 264);
     this.Splitter1.TabIndex = 6;
     this.Splitter1.TabStop = false;
     // 
     // treeDB
     // 
     this.treeDB.Dock = System.Windows.Forms.DockStyle.Left;
     this.treeDB.ImageIndex = -1;
     this.treeDB.Name = "treeDB";
     this.treeDB.SelectedImageIndex = -1;
     this.treeDB.Size = new System.Drawing.Size(236, 264);
     this.treeDB.TabIndex = 4;
     this.treeDB.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDB_AfterSelect);
     this.treeDB.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeDB_BeforeExpand);
     // 
     // Panel1
     // 
     this.Panel1.Controls.AddRange(new System.Windows.Forms.Control[] {
                                        this.cmdClose,
                                        this.GroupBox1});
     this.Panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
     this.Panel1.Location = new System.Drawing.Point(5, 269);
     this.Panel1.Name = "Panel1";
     this.Panel1.Size = new System.Drawing.Size(446, 36);
     this.Panel1.TabIndex = 7;
     // 
     // cmdClose
     // 
     this.cmdClose.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
     this.cmdClose.FlatStyle = System.Windows.Forms.FlatStyle.System;
     this.cmdClose.Location = new System.Drawing.Point(372, 12);
     this.cmdClose.Name = "cmdClose";
     this.cmdClose.Size = new System.Drawing.Size(72, 24);
     this.cmdClose.TabIndex = 4;
     this.cmdClose.Text = "Close";
     this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click);
     // 
     // GroupBox1
     // 
     this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
       | System.Windows.Forms.AnchorStyles.Right);
     this.GroupBox1.Name = "GroupBox1";
     this.GroupBox1.Size = new System.Drawing.Size(444, 8);
     this.GroupBox1.TabIndex = 5;
     this.GroupBox1.TabStop = false;
     // 
     // TreeViewDataBinding
     // 
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
     this.ClientSize = new System.Drawing.Size(456, 310);
     this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                     this.Panel2,
                                     this.Panel1});
     this.DockPadding.All = 5;
     this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
     this.Name = "TreeViewDataBinding";
     this.Text = "TreeViewDataBinding";
     this.Load += new System.EventHandler(this.TreeViewDataBinding_Load);
     this.Panel2.ResumeLayout(false);
     this.Panel3.ResumeLayout(false);
     this.Panel1.ResumeLayout(false);
     this.ResumeLayout(false);
   }
   #endregion
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
   static void Main() 
   {
     Application.Run(new TreeViewDataBinding());
   }
   private ProductDatabase DataClass = new ProductDatabase();
   private void TreeViewDataBinding_Load(object sender, System.EventArgs e)
   {
     TreeNode nodeParent;
     foreach (DataRow row in DataClass.GetCategories().Rows)
     {
       // Add the category node.
       nodeParent = treeDB.Nodes.Add(row[ProductDatabase.CategoryField.Name].ToString());
       nodeParent.ImageIndex = 0;
       // Store the disconnected category information.
       nodeParent.Tag = row;
       // Add a "dummy" node.
       nodeParent.Nodes.Add("*");
     }
   
   }
   private void treeDB_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
   {
     TreeNode nodeSelected, nodeChild;
     nodeSelected = e.Node;
     if (nodeSelected.Nodes[0].Text == "*")
     {
       // This is a dummy node.
       nodeSelected.Nodes.Clear();
       foreach (DataRow row in
         DataClass.GetProductsInCategory((DataRow)nodeSelected.Tag))
       {
         nodeChild = nodeSelected.Nodes.Add(row[ProductDatabase.ProductField.Name].ToString());
         // Store the disconnected product information.
         nodeChild.Tag = row;
         nodeChild.ImageIndex = 1;
         nodeChild.SelectedImageIndex = 1;
       }
     }
   }
   private void treeDB_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
   {
      lblInfo.Text = DataClass.GetDisplayText((DataRow)e.Node.Tag);
   }
   private void cmdClose_Click(object sender, System.EventArgs e)
   {
     this.Close();
   }
 }
 public class ProductDatabase
 {
   public class Tables
   {
     public const string Product = "Products";
     public const string Category = "Categories";
   }
   public class ProductField
   {
     public const string Name = "ModelName";
     public const string Description = "Description";
   }
   public class CategoryField
   {
     public const string Name = "CategoryName";
   }
   private DataSet dsStore;
   DataRelation relCategoryProduct;
   public ProductDatabase()
   {
     dsStore = new DataSet();
     dsStore.ReadXmlSchema(Application.StartupPath + "\\store.xsd");
     dsStore.ReadXml(Application.StartupPath + "\\store.xml");
     // Define the relation.
     relCategoryProduct = new DataRelation("Prod_Cat", 
       dsStore.Tables["Categories"].Columns["CategoryID"], 
       dsStore.Tables["Products"].Columns["CategoryID"]);
     dsStore.Relations.Add(relCategoryProduct);
   }
   public DataTable GetCategories()
   {
     return dsStore.Tables["Categories"];
   }
   public DataRow[] GetProductsInCategory(DataRow rowParent)
   {
     return rowParent.GetChildRows(relCategoryProduct);
   }
   public string GetDisplayText(DataRow row)
   {
     string text = "";
     switch (row.Table.TableName)
     {
       case Tables.Product:
         text = "ID: " + row[0] + "\n";
         text += "Name: " + row[ProductField.Name] + "\n\n";
         text += row[ProductField.Description];
         break;
     }
     return text;
   }
 }

}


      </source>

<A href="http://www.nfex.ru/Code/CSharpDownload/TreeViewDataBinding.zip">TreeViewDataBinding.zip( 56 k)</a>


TreeView Demo

<source lang="csharp"> /* Professional Windows GUI Programming Using C# by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury,

  Zach Greenvoss, Shripad Kulkarni, Neil Whitlow

Publisher: Peer Information ISBN: 1861007663

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; namespace TreeView {

 /// <summary>
 /// Summary description for TreeViewDemo.
 /// </summary>
 public class TreeViewDemo : System.Windows.Forms.Form
 {
   private System.Windows.Forms.TreeView treeView1;
   /// <summary>
   /// Required designer variable.
   /// </summary>
   private System.ruponentModel.Container components = null;
   ImageList il = new ImageList();
   public TreeViewDemo()
   {
     //
     // Required for Windows Form Designer support
     //
     InitializeComponent();
     //
     // TODO: Add any constructor code after InitializeComponent call
     //
   }
   /// <summary>
   /// Clean up any resources being used.
   /// </summary>
   protected override void Dispose( bool disposing )
   {
     if( disposing )
     {
       if (components != null) 
       {
         components.Dispose();
       }
     }
     base.Dispose( disposing );
   }
   #region Windows Form Designer generated code
   /// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   private void InitializeComponent()
   {
        this.treeView1 = new System.Windows.Forms.TreeView();
        this.SuspendLayout();
        // 
        // treeView1
        // 
        this.treeView1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
           | System.Windows.Forms.AnchorStyles.Left) 
           | System.Windows.Forms.AnchorStyles.Right);
        this.treeView1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
        this.treeView1.HotTracking = true;
        this.treeView1.ImageIndex = -1;
        this.treeView1.Indent = 30;
        this.treeView1.ItemHeight = 30;
        this.treeView1.LabelEdit = true;
        this.treeView1.Location = new System.Drawing.Point(8, 16);
        this.treeView1.Name = "treeView1";
        this.treeView1.SelectedImageIndex = -1;
        this.treeView1.Size = new System.Drawing.Size(360, 272);
        this.treeView1.TabIndex = 0;
        // 
        // TreeViewDemo
        // 
        this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
        this.ClientSize = new System.Drawing.Size(376, 309);
        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                     this.treeView1});
        this.Name = "TreeViewDemo";
        this.Text = "TreeView Control";
        this.Load += new System.EventHandler(this.TreeViewDemo_Load);
        this.ResumeLayout(false);
     }
   #endregion
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
   static void Main() 
   {
     Application.Run(new TreeViewDemo());
   }
   private void TreeViewDemo_Load(object sender, System.EventArgs e)
   {
     // Select icons into the image list
     il.Images.Add(new Icon("KEY04.ICO"));
     il.Images.Add(new Icon("ARW06LT.ICO"));
     il.Images.Add(new Icon("LITENING.ICO"));
     il.Images.Add(new Icon("ARW06UP.ICO"));
     treeView1.ImageList = il ; 
 
     // Create the RootNode
     TreeNode rootNode = treeView1.Nodes.Add("USA");
     rootNode.ImageIndex =0 ;
     // Create the Child nodes for the root
     TreeNode states1 = rootNode.Nodes.Add("New York");
     states1.ImageIndex =1 ;
     TreeNode states2 = rootNode.Nodes.Add("Michigan");
     states2.ImageIndex =1 ;
     TreeNode states3 = rootNode.Nodes.Add("Wisconsin");
     states3.ImageIndex =1 ;
     TreeNode states4 = rootNode.Nodes.Add("California");
     states4.ImageIndex =1 ;
     // Create siblings nodes for the Child nodes 
     TreeNode child = states1.Nodes.Add("Rochester");
     child.ImageIndex = 2 ;
     child =states1.Nodes.Add("new York");
     child.ImageIndex = 2 ;
     child =states1.Nodes.Add("Albany");
     child.ImageIndex = 2 ;
     child = states2.Nodes.Add("Detroit");
     child.ImageIndex = 2 ;
     child =states2.Nodes.Add("Ann Arbor");
     child.ImageIndex = 2 ;
     child =states2.Nodes.Add("Lansing");
     child.ImageIndex = 2 ;
     child = states3.Nodes.Add("Milwaukee");
     child.ImageIndex = 2 ;
     child =states3.Nodes.Add("Madison");
     child.ImageIndex = 2 ;
     child =states3.Nodes.Add("La Cross");
     child.ImageIndex = 2 ;
   
     child = states4.Nodes.Add("Los Angeles");
     child.ImageIndex = 2 ;
     child =states4.Nodes.Add("San Fransisco");
     child.ImageIndex = 2 ;
     child =states4.Nodes.Add("San Diego");
     child.ImageIndex = 2 ;
   }
 }

}


      </source>

<A href="http://www.nfex.ru/Code/CSharpDownload/TreeView.zip">TreeView.zip( 32 k)</a>


TreeView Drag And Drop

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; namespace TreeViewDragAndDrop {

   /// <summary>
   /// Summary description for TreeViewDragAndDrop.
   /// </summary>
   public class TreeViewDragAndDrop : System.Windows.Forms.Form
   {
       internal System.Windows.Forms.TreeView treeTwo;
       internal System.Windows.Forms.Splitter Splitter1;
       internal System.Windows.Forms.TreeView treeOne;
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public TreeViewDragAndDrop()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if (components != null) 
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           this.treeTwo = new System.Windows.Forms.TreeView();
           this.Splitter1 = new System.Windows.Forms.Splitter();
           this.treeOne = new System.Windows.Forms.TreeView();
           this.SuspendLayout();
           // 
           // treeTwo
           // 
           this.treeTwo.Dock = System.Windows.Forms.DockStyle.Fill;
           this.treeTwo.HideSelection = false;
           this.treeTwo.ImageIndex = -1;
           this.treeTwo.Location = new System.Drawing.Point(239, 0);
           this.treeTwo.Name = "treeTwo";
           this.treeTwo.SelectedImageIndex = -1;
           this.treeTwo.Size = new System.Drawing.Size(281, 366);
           this.treeTwo.TabIndex = 6;
           this.treeTwo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown);
           this.treeTwo.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver);
           this.treeTwo.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop);
           // 
           // Splitter1
           // 
           this.Splitter1.Location = new System.Drawing.Point(236, 0);
           this.Splitter1.Name = "Splitter1";
           this.Splitter1.Size = new System.Drawing.Size(3, 366);
           this.Splitter1.TabIndex = 5;
           this.Splitter1.TabStop = false;
           // 
           // treeOne
           // 
           this.treeOne.Dock = System.Windows.Forms.DockStyle.Left;
           this.treeOne.HideSelection = false;
           this.treeOne.ImageIndex = -1;
           this.treeOne.Name = "treeOne";
           this.treeOne.SelectedImageIndex = -1;
           this.treeOne.Size = new System.Drawing.Size(236, 366);
           this.treeOne.TabIndex = 4;
           this.treeOne.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown);
           this.treeOne.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver);
           this.treeOne.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop);
           // 
           // TreeViewDragAndDrop
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
           this.ClientSize = new System.Drawing.Size(520, 366);
           this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                         this.treeTwo,
                                                                         this.Splitter1,
                                                                         this.treeOne});
           this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
           this.Name = "TreeViewDragAndDrop";
           this.Text = "TreeView Drag-And-Drop";
           this.Load += new System.EventHandler(this.TreeViewDragAndDrop_Load);
           this.ResumeLayout(false);
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new TreeViewDragAndDrop());
       }
       private void TreeViewDragAndDrop_Load(object sender, System.EventArgs e)
       {
           TreeNode node = treeOne.Nodes.Add("Fruits");
           node.Nodes.Add("Apple");
           node.Nodes.Add("Peach");
           node.Expand();
           
           node = treeTwo.Nodes.Add("Vegetables");
           node.Nodes.Add("Tomato");
           node.Nodes.Add("Eggplant");
           node.Expand();
           
           treeTwo.AllowDrop = true;
           treeOne.AllowDrop = true;
       }
       private void tree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
       {
           // Get the tree.
           TreeView tree = (TreeView)sender;
           // Get the node underneath the mouse.
           TreeNode node = tree.GetNodeAt(e.X, e.Y);
           tree.SelectedNode = node;
           // Start the drag-and-drop operation with a cloned copy of the node.
           if (node != null)
           {
               tree.DoDragDrop(node.Clone(), DragDropEffects.Copy);
           }
       }
       private void tree_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
       {
           // Get the tree.
           TreeView tree = (TreeView)sender;
           // Drag and drop denied by default.
           e.Effect = DragDropEffects.None;
           // Is it a valid format?
           if (e.Data.GetData(typeof(TreeNode)) != null)
           {
               // Get the screen point.
               Point pt = new Point(e.X, e.Y);
               // Convert to a point in the TreeView"s coordinate system.
               pt = tree.PointToClient(pt);
               // Is the mouse over a valid node?
               TreeNode node = tree.GetNodeAt(pt);
               if (node != null)
               {
                   e.Effect = DragDropEffects.Copy;
                   tree.SelectedNode = node;
               }
           }
       }
       private void tree_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
       {
           // Get the tree.
           TreeView tree = (TreeView)sender;
           // Get the screen point.
           Point pt = new Point(e.X, e.Y);
           // Convert to a point in the TreeView"s coordinate system.
           pt = tree.PointToClient(pt);
           // Get the node underneath the mouse.
           TreeNode node = tree.GetNodeAt(pt);
           // Add a child node.
           node.Nodes.Add((TreeNode)e.Data.GetData(typeof(TreeNode)));
           // Show the newly added node if it is not already visible.
           node.Expand();
       }
   }

}


      </source>


TreeView Example

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; namespace TreeViewExample {

   /// <summary>
   /// Summary description for TreeViewExample.
   /// </summary>
   public class TreeViewExample : System.Windows.Forms.Form
   {
       internal System.Windows.Forms.TreeView treeFood;
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public TreeViewExample()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if (components != null) 
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           this.treeFood = new System.Windows.Forms.TreeView();
           this.SuspendLayout();
           // 
           // treeFood
           // 
           this.treeFood.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
               | System.Windows.Forms.AnchorStyles.Left) 
               | System.Windows.Forms.AnchorStyles.Right);
           this.treeFood.ImageIndex = -1;
           this.treeFood.Location = new System.Drawing.Point(4, 5);
           this.treeFood.Name = "treeFood";
           this.treeFood.SelectedImageIndex = -1;
           this.treeFood.Size = new System.Drawing.Size(284, 256);
           this.treeFood.TabIndex = 1;
           this.treeFood.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeFood_AfterSelect);
           // 
           // TreeViewExample
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(292, 266);
           this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                         this.treeFood});
           this.Name = "TreeViewExample";
           this.Text = "TreeView Example";
           this.Load += new System.EventHandler(this.TreeViewExample_Load);
           this.ResumeLayout(false);
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new TreeViewExample());
       }
       private void TreeViewExample_Load(object sender, System.EventArgs e)
       {
           TreeNode node;
           
           node = treeFood.Nodes.Add("Fruits");
           node.Nodes.Add("Apple");
           node.Nodes.Add("Peach");
           
           node = treeFood.Nodes.Add("Vegetables");
           node.Nodes.Add("Tomato");
           node.Nodes.Add("Eggplant");
       }
       private void treeFood_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
       {
           if (e.Action == TreeViewAction.ByMouse)
           {
               MessageBox.Show(e.Node.FullPath);
           }
       }
   }

}


      </source>


TreeView ImageIndex

<source lang="csharp"> using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; public class Form1 : System.Windows.Forms.Form {

   private System.Windows.Forms.TreeView treeView1;
   ImageList il = new ImageList();
   public Form1() {
       this.treeView1 = new System.Windows.Forms.TreeView();
       this.SuspendLayout();
       this.treeView1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
          | System.Windows.Forms.AnchorStyles.Left)
          | System.Windows.Forms.AnchorStyles.Right);
       this.treeView1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
       this.treeView1.HotTracking = true;
       this.treeView1.ImageIndex = -1;
       this.treeView1.Indent = 30;
       this.treeView1.ItemHeight = 30;
       this.treeView1.LabelEdit = true;
       this.treeView1.Location = new System.Drawing.Point(8, 16);
       this.treeView1.SelectedImageIndex = -1;
       this.treeView1.Size = new System.Drawing.Size(360, 272);
       this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
       this.ClientSize = new System.Drawing.Size(376, 309);
       this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                     this.treeView1});
       this.Text = "TreeView Control";
       this.Load += new System.EventHandler(this.Form1_Load);
       this.ResumeLayout(false);
   }
   [STAThread]
   static void Main() {
       Application.Run(new Form1());
   }
   private void Form1_Load(object sender, System.EventArgs e) {
       il.Images.Add(new Icon("1.ICO"));
       il.Images.Add(new Icon("2.ICO"));
       il.Images.Add(new Icon("3.ICO"));
       il.Images.Add(new Icon("4.ICO"));
       treeView1.ImageList = il;
       TreeNode rootNode = treeView1.Nodes.Add("USA");
       rootNode.ImageIndex = 0;
       TreeNode states1 = rootNode.Nodes.Add("a");
       states1.ImageIndex = 1;
       TreeNode states2 = rootNode.Nodes.Add("b");
       states2.ImageIndex = 1;
       TreeNode states3 = rootNode.Nodes.Add("c");
       states3.ImageIndex = 1;
       TreeNode states4 = rootNode.Nodes.Add("d");
       states4.ImageIndex = 1;
       TreeNode child = states1.Nodes.Add("A");
       child.ImageIndex = 2;
       child = states1.Nodes.Add("e");
       child.ImageIndex = 2;
       child = states1.Nodes.Add("f");
       child.ImageIndex = 2;
       child = states2.Nodes.Add("g");
       child.ImageIndex = 2;
       child = states2.Nodes.Add("h");
       child.ImageIndex = 2;
       child = states2.Nodes.Add("i");
       child.ImageIndex = 2;
       child = states3.Nodes.Add("j");
       child.ImageIndex = 2;
       child = states3.Nodes.Add("k");
       child.ImageIndex = 2;
       child = states3.Nodes.Add("l");
       child.ImageIndex = 2;
       child = states4.Nodes.Add("m");
       child.ImageIndex = 2;
       child = states4.Nodes.Add("n");
       child.ImageIndex = 2;
       child = states4.Nodes.Add("o");
       child.ImageIndex = 2;
   }

}

</source>