GUI Windows Form C#

/*
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.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace CustomTreeView
{
    /// 
    /// Summary description for Form1.
    /// 

    public class CustomTreeView : System.Windows.Forms.Form
    {
        internal System.Windows.Forms.ImageList imagesTree;
        private ProjectTree tree;
        private System.ComponentModel.IContainer components;
        public CustomTreeView()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
        /// 
        /// Clean up any resources being used.
        /// 

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
//            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(CustomTreeView));
            this.imagesTree = new System.Windows.Forms.ImageList(this.components);
            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
        /// 
        /// The main entry point for the application.
        /// 

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