最进在使用VS2005开发时,发现有很多新东西,比如,我们常用的ToolBar ,MainMenu,StatusBar,变成了功能强大,样式新颖的,ToolStrip,MenuStrip,StatusStrip,等.不过还是有些不足,比如,ComboBox 变化不大,下拉框里面只能是文本的,很不方便,我的想法是在下拉ComboBox时会出现TreeView 控件,这也是我今天要做的控件ComboBoxTreeView
 开始写了一个,关键点是弹出TreeView 控件,但是把TreeView 做成一个窗体,弹出,还是有什么办法,一查VS2005有一个类窗体弹出类(很强大的对象)ToolStripDropDown, 在使用此类的时候需要传递一个ToolStripControlHost类型的对象,还有个问题就是,TreeView 弹出了,会在它的上方出现了一条小白条,这个问题很棘手,不过如果你懂Win32那就一切OK了,好,我们看看这个类吧.
 一:ComboBoxTreeView
 
using System.Data;
 using System.Text;
 using System.Windows.Forms;
 namespace WindowsApplication14
 { 
 
     public class ComboBoxTreeView : ComboBox
     { 
 
         private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;
         ToolStripControlHost treeViewHost;
         ToolStripDropDown dropDown;
         public ComboBoxTreeView()
         { 
 
             TreeView treeView = new TreeView();
             treeView.AfterSelect+=new TreeViewEventHandler(treeView_AfterSelect);
             treeView.BorderStyle = BorderStyle.None;
            
             treeViewHost = new ToolStripControlHost(treeView);
             dropDown = new ToolStripDropDown();
             dropDown.Width = this.Width;
             dropDown.Items.Add(treeViewHost);
         }
         public void treeView_AfterSelect(object sender, TreeViewEventArgs e)
         { 
 
             this.Text=TreeView.SelectedNode.Text;
             dropDown.Close();
         }
         public TreeView TreeView
         { 
 
             get { return treeViewHost.Control as TreeView; }
         }
         private void ShowDropDown()
         { 
 
             if (dropDown != null)
             { 
 
                treeViewHost.Size =new Size(DropDownWidth-2,DropDownHeight);       
                dropDown.Show(this, 0, this.Height);
             }
         }
         protected override void WndProc(ref Message m)
         { 
 
             if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)
             { 
 
                 ShowDropDown();
                 return;
             }        
             base.WndProc(ref m);
         }
         protected override void Dispose(bool disposing)
         { 
 
             if (disposing)
             { 
 
                 if (dropDown != null)
                 { 
 
                     dropDown.Dispose();
                     dropDown = null;
                 }
             }
             base.Dispose(disposing);
         }
     }}附图:

 二:
 ToolStrip
 工具条中可以插入文本,下拉框,等,如果要插入下拉树的列表框但不可以直接插入ComboBoxTreeView,必须继承上面提到的ToolStripControlHost类,
using System;
 using System.Windows;
 using System.Windows.Forms;
 using System.ComponentModel;
 using System.Drawing;
 using System.Drawing.Design;
 using ;namespace WindowsApplication14
 {  
     [DefaultProperty("Items")]
     [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | (ToolStripItemDesignerAvailability.MenuStrip | ToolStripItemDesignerAvailability.ToolStrip))]
     public class ToolStripComboBoxTreeView : ToolStripControlHost
     {  
         ToolStripComboBoxTreeViewControl#region ToolStripComboBoxTreeViewControl
         internal class ToolStripComboBoxTreeViewControl  : ComboBox
         {  
             private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;
             ToolStripControlHost treeViewHost;
             ToolStripDropDown dropDown;
             private ToolStripComboBoxTreeView owner;            public ToolStripComboBoxTreeView Owner
             {  
                 get
                 {  
                     return owner;
                 }
                 set
                 {  
                     owner = value;
                 }
             }
             public ToolStripComboBoxTreeViewControl()
             {  
                 TreeView treeView = new TreeView();
                 treeView.AfterSelect += new TreeViewEventHandler(treeView_AfterSelect);
                 treeView.BorderStyle = BorderStyle.None;                treeViewHost = new ToolStripControlHost(treeView);
                 dropDown = new ToolStripDropDown();
                 dropDown.Width = this.Width;
                 dropDown.Items.Add(treeViewHost);
             }
             public void treeView_AfterSelect(object sender, TreeViewEventArgs e)
             {  
                 this.Text = TreeView.SelectedNode.Text;
                 if (Owner.DropDown != null)
                 {  
                     Owner.DropDown(this, e);
                 }
                 dropDown.Close();
             }
             public TreeView TreeView
             {  
                 get 
                 { 
                     return treeViewHost.Control as TreeView;
                 }
             }
             private void ShowDropDown()
             {  
                 if (dropDown != null)
                 {  
                     treeViewHost.Size = new Size(DropDownWidth - 2, DropDownHeight);
                     dropDown.Show(this, 0, this.Height);
                 }
             }
             protected override void WndProc(ref Message m)
             {  
                 if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)
                 {  
                     ShowDropDown();
                     return;
                 }
                 base.WndProc(ref m);
             }
             protected override void Dispose(bool disposing)
             {  
                 if (disposing)
                 {  
                     if (dropDown != null)
                     {  
                         dropDown.Dispose();
                         dropDown = null;
                     }
                 }
                 base.Dispose(disposing);
             }
         }
         #endregion
         public ToolStripComboBoxTreeView()
             : base(ToolStripComboBoxTreeView.CreateControlInstance())
         {  
             ToolStripComboBoxTreeView.ToolStripComboBoxTreeViewControl control = 
                 base.Control as ToolStripComboBoxTreeView.ToolStripComboBoxTreeViewControl;
                 control.Owner = this;
                         }
         private static Control CreateControlInstance()
         {  
             ComboBox comboBox = new ToolStripComboBoxTreeViewControl();
             return comboBox;
         }
         属性#region 属性
         [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
         public ComboBox ComboBox
         {  
             get
             {  
                 return (base.Control as ComboBox);
             }
         }
         [Browsable(true)]
         public TreeView TreeView
         {  
             get
             {  
                     ToolStripComboBoxTreeView.ToolStripComboBoxTreeViewControl control = 
                 base.Control as ToolStripComboBoxTreeView.ToolStripComboBoxTreeViewControl;
                     return control.TreeView;
             }
         }
         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
         [Editor(".ListControlStringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
         [Browsable(true)]
         [EditorBrowsable(EditorBrowsableState.Always)] 
         [Localizable(true)]
         public AutoCompleteStringCollection AutoCompleteCustomSource
         {  
             get
             {  
                 return this.ComboBox.AutoCompleteCustomSource;
             }
             set
             {  
                 this.ComboBox.AutoCompleteCustomSource = value;
             }
         }
         [Browsable(false)]
         [ DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
         public int SelectionLength
         {  
             get
             {  
                 return this.ComboBox.SelectionLength;
             }
             set
             {  
                 this.ComboBox.SelectionLength = value;
             }
         }
         [Browsable(false)]
         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
         public int SelectionStart
         {  
             get
             {  
                 return this.ComboBox.SelectionStart;
             }
             set
             {  
                 this.ComboBox.SelectionStart = value;
             }
         }
         [DefaultValue(0)]
         [Localizable(true)]
         [Description("下拉框最大长度")]
         public int MaxLength
         {  
             get
             {  
                 return this.ComboBox.MaxLength;
             }
             set
             {  
                 this.ComboBox.MaxLength = value;
             }
         }    
         [DefaultValue(1)]
         [RefreshProperties(RefreshProperties.Repaint)]
         public ComboBoxStyle DropDownStyle
         {  
             get
             {  
                 return this.ComboBox.DropDownStyle;
             }
             set
             {  
                 this.ComboBox.DropDownStyle = value;
             }
         }
         [EditorBrowsable(EditorBrowsableState.Always)]
         [Browsable(true)]
         [DefaultValue(106)]
         public int DropDownHeight
         {  
             get
             {  
                 return this.ComboBox.DropDownHeight;
             }
             set
             {  
                 this.ComboBox.DropDownHeight = value;
             }
         }
         public int DropDownWidth
         {  
             get
             {  
                 return this.ComboBox.DropDownWidth;
             }
             set
             {  
                 this.ComboBox.DropDownWidth = value;
             }
         }
         #endregion
         方法#region 方法
         public void SelectAll()
         {  
             ComboBox.SelectAll();
         }
         public void Select(int start, int length)
         {  
             ComboBox.Select(start, length);
         }
         #endregion
         事件#region 事件
       
         public event EventHandler DropDown;
  
         #endregion
        
     }
 }
 附图:

客户端调用方法:
 
public static void Main(){  
    toolStripComboBoxTreeView1.TreeView.ImageList = this.imageList1;
             TreeNode root = new TreeNode("根节点",1,2);
             root.Nodes.Add("节点1");
             root.Nodes.Add("节点2");
             root.Nodes.Add("节点3");
             root.Nodes.Add("节点4");
             root.Nodes.Add("节点5");
             root.Nodes.Add("节点6");
             toolStripComboBoxTreeView1.TreeView.Nodes.Add(root);
 } 
 
                     
            
        













 
                    

 
                 
                    