/// <summary>
 /// Raises the <see cref="TreeView.AfterSelect"/> event.
 /// </summary>
 /// <remarks>
 /// This handles the selection and unselection of nodes.
 /// </remarks>
 /// <param name="e">A <see cref="TreeViewEventArgs"/> describing the event arguments.</param>
 protected override void OnAfterSelect(TreeViewEventArgs e)
 {
     if (MultiSelect)
     {
         if (((ModifierKeys & Keys.Control) > 0))
         {
             if (!SelectedNodes.Contains(e.Node))
             {
                 SelectedNodes.Add(e.Node);
             }
             else
             {
                 SelectedNodes.Remove(e.Node);
             }
         }
         else
         {
             if (((ModifierKeys & Keys.Shift) > 0) && (m_tndFirst != null))
             {
                 SelectedNodes.Clear();
                 SelectedNodes.AddRange(FindPath(m_tndFirst, e.Node));
             }
             else
             {
                 if (SelectedNodes.Count > 0)
                 {
                     SelectedNodes.Clear();
                 }
                 SelectedNodes.Add(e.Node);
             }
         }
     }
     base.OnAfterSelect(e);
     if (!MultiSelect)
     {
         if (!SelectedNodes.Contains(e.Node))
         {
             SelectedNodes.Clear();
             SelectedNodes.Add(e.Node);
         }
     }
 }