GUI Windows Forms C# Tutorial

/* Quote from 
Programming .NET Windows Applications
By Jesse Liberty, Dan Hurwitz
First Edition October 2003 
Pages: 1246 (More details)
*/
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;        // necessary for Directory info
public class TreeViewDirectories : Form
{
  TreeView tvw;
  CheckBox cb;
  Button btnSelected;
  Button btnExpand;
  Button btnExpandAll;
  Button btnCollapse;
  Button btnCollapseAll;
  Button btnToggle;
  public TreeViewDirectories()
  {
    Size = new Size(400,600);
    ImageList imgList = new ImageList();
    Image img;
    String[] arFiles = {"1.ico","2.ico","3.ico",".ico"};
    for (int i = 0; i < arFiles.Length; i++)
    {
      img = Image.FromFile(arFiles[i]);
      imgList.Images.Add(img);
    }
    tvw = new TreeView();
    tvw.Parent = this;
    tvw.Location = new Point(10,10);
    tvw.Size = new Size(ClientSize.Width - 20, Height - 200);
    tvw.Anchor = AnchorStyles.Top | AnchorStyles.Left | 
          AnchorStyles.Right | AnchorStyles.Bottom;
    tvw.BackColor = Color.Moccasin;
    tvw.ForeColor = Color.DarkRed;
    tvw.BorderStyle = BorderStyle.Fixed3D;
    tvw.FullRowSelect = false;    
    tvw.ShowLines = true;      
    tvw.ShowPlusMinus = true;    
    tvw.Scrollable = true;      
    tvw.HideSelection = false;  
    tvw.HotTracking = true;  
    tvw.ImageList = imgList;
    tvw.ImageIndex = 1;
    tvw.SelectedImageIndex = 2;
    tvw.Indent = 35;
    tvw.Font = new Font("Times New Roman", 20f);
    tvw.ItemHeight = tvw.Font.Height * 2;
    tvw.BeforeExpand += new TreeViewCancelEventHandler(tvw_BeforeExpand);
    cb = new CheckBox();
    cb.Parent = this;
    cb.Location = new Point((Width - cb.Width) * 2 / 10, tvw.Bottom + 25);
    cb.Text = "Show Files";
    cb.Anchor = AnchorStyles.Bottom;
    cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
    btnSelected = new Button();
    btnSelected.Parent = this;
    btnSelected.Text = "&SelectedNode";
    int xSize = ((int)(Font.Height * .75) * btnSelected.Text.Length);
    int ySize = Font.Height + 10;
    btnSelected.Size = new Size(xSize, ySize);
    btnSelected.Location = new Point(cb.Left, cb.Bottom + ySize);
    btnSelected.Anchor = AnchorStyles.Bottom;
    btnSelected.Click += new EventHandler(btnSelected_Click);
    btnToggle = new Button();
    btnToggle.Parent = this;
    btnToggle.Location = new Point((Width - cb.Width) * 7 / 10,
                                      cb.Top);
    btnToggle.Text = "&Toggle";
    btnToggle.Size = new Size(btnSelected.Width, btnSelected.Height);
    btnToggle.Anchor = AnchorStyles.Bottom;
    btnToggle.Click += new EventHandler(btnToggle_Click);
    btnExpand = new Button();
    btnExpand.Parent = this;
    btnExpand.Location = new Point(btnToggle.Left, btnToggle.Bottom);
    btnExpand.Text = "&Expand";
    btnExpand.Size = new Size(btnSelected.Width, btnSelected.Height);
    btnExpand.Anchor = AnchorStyles.Bottom;
    btnExpand.Click += new EventHandler(btnExpand_Click);
    btnExpandAll = new Button();
    btnExpandAll.Parent = this;
    btnExpandAll.Location = new Point(btnExpand.Left, btnExpand.Bottom);
    btnExpandAll.Text = "Expand &All";
    btnExpandAll.Size = new Size(btnSelected.Width, btnSelected.Height);
    btnExpandAll.Anchor = AnchorStyles.Bottom;
    btnExpandAll.Click += new EventHandler(btnExpandAll_Click);
    btnCollapse = new Button();
    btnCollapse.Parent = this;
    btnCollapse.Location = new Point(btnExpandAll.Left, btnExpandAll.Bottom);
    btnCollapse.Text = "&Collapse";
    btnCollapse.Size = new Size(btnSelected.Width, btnSelected.Height);
    btnCollapse.Anchor = AnchorStyles.Bottom;
    btnCollapse.Click += new EventHandler(btnCollapse_Click);
    btnCollapseAll = new Button();
    btnCollapseAll.Parent = this;
    btnCollapseAll.Location = new Point(btnCollapse.Left, btnCollapse.Bottom);
    btnCollapseAll.Text = "Colla&pse All";
    btnCollapseAll.Size = new Size(btnSelected.Width, btnSelected.Height);
    btnCollapseAll.Anchor = AnchorStyles.Bottom;
    btnCollapseAll.Click += new EventHandler(btnCollapseAll_Click);
    FillDirectoryTree();
  }
  static void Main() 
  {
    Application.Run(new TreeViewDirectories());
  }
  private void FillDirectoryTree()
  {
    tvw.BeginUpdate();
    tvw.Nodes.Clear();
    string[] strDrives = Environment.GetLogicalDrives();
        foreach (string rootDirectoryName in strDrives)
       {
      try 
      {
        Directory.GetDirectories(rootDirectoryName);
        TreeNode ndRoot = new TreeNode(rootDirectoryName);
        tvw.Nodes.Add(ndRoot);
        if (ndRoot.Index % 2 == 0)
        {
          ndRoot.BackColor = Color.LightYellow;
          ndRoot.ForeColor = Color.Green;
        }
        GetSubDirectoryNodes(ndRoot, cb.Checked);
      }
      catch  (System.IO.IOException)
      {
            }
      catch  (Exception e)
      {
        MessageBox.Show(e.Message);
            }
    }
     
      tvw.EndUpdate();
     
  }
  private void GetSubDirectoryNodes(TreeNode parentNode, bool getFileNames)
  {
    DirectoryInfo di = new DirectoryInfo(parentNode.FullPath);
    if ((di.Attributes & FileAttributes.Directory) == 0)
    {
      return;
    }
    parentNode.Nodes.Clear();
    string[] arSubs = Directory.GetDirectories(parentNode.FullPath);
    foreach (string subDir in arSubs)
    {
          DirectoryInfo dirInfo = new DirectoryInfo(subDir);
            if ((dirInfo.Attributes & FileAttributes.Hidden)!= 0)
            {
               continue;
            }
      TreeNode subNode = new TreeNode(dirInfo.Name);
      parentNode.Nodes.Add(subNode);
        
      //  Set colors based on Index property.
      if (subNode.Index % 2 == 0)
        subNode.BackColor = Color.LightPink;
    }
    if (getFileNames)
    {
            //  Get any files for this node.
          string[] files = Directory.GetFiles(parentNode.FullPath);
            // After placing the nodes, 
            // now place the files in that subdirectory.
            foreach (string str in files)
            {
        FileInfo fi = new FileInfo(str);
        TreeNode fileNode = new TreeNode(fi.Name);
        parentNode.Nodes.Add(fileNode);
        //  Set the icon
        fileNode.ImageIndex = 0;
        fileNode.SelectedImageIndex = 3;
        //  Set colors based on Index property.
        if (fileNode.Index % 2 == 0)
          fileNode.BackColor = Color.LightGreen;
            }
    }
  }  // close GetSubDirectoryNodes
  private void cb_CheckedChanged(object sender, EventArgs e)
  {
    FillDirectoryTree();
  }
  private void tvw_BeforeExpand(object sender, 
                TreeViewCancelEventArgs e)
  {
    tvw.BeginUpdate();
    foreach (TreeNode tn in e.Node.Nodes)
    {
      GetSubDirectoryNodes(tn, cb.Checked);
    }
    tvw.EndUpdate();      
  }    
  private void btnSelected_Click(object sender, EventArgs e)
  {
    MessageBox.Show(tvw.SelectedNode.ToString() + "\n" +
        "FullPath:\t" + tvw.SelectedNode.FullPath.ToString() + "\n" +
           "Index:\t" + tvw.SelectedNode.Index.ToString());
  }
  private void btnExpand_Click(object sender, EventArgs e)
  {
    tvw.SelectedNode.Expand();
  }
  private void btnExpandAll_Click(object sender, EventArgs e)
  {
    tvw.SelectedNode.ExpandAll();
  }
  private void btnCollapse_Click(object sender, EventArgs e)
  {
    tvw.SelectedNode.Collapse();
  }
  private void btnCollapseAll_Click(object sender, EventArgs e)
  {
    tvw.CollapseAll();
  }
  private void btnToggle_Click(object sender, EventArgs e)
  {
    tvw.SelectedNode.Toggle();
  }
}