开发VS2005下ComboBoxTreeView(下拉列表框弹出树) 与ToolStripComboBoxTreeView(下拉列表框工具条弹出树)
最进在使用VS2005开发时,发现有很多新东西,比如,我们常用的ToolBar ,MainMenu,StatusBar,变成了功能强大,样式新颖的,ToolStrip,MenuStrip,StatusStrip,等.不过还是有些不足,比如,ComboBox 变化不大,下拉框里面只能是文本的,很不方便,我的想法是在下拉ComboBox时会出现TreeView 控件,这也是我今天要做的控件ComboBoxTreeView
开始写了一个,关键点是弹出TreeView 控件,但是把TreeView 做成一个窗体,弹出,还是有什么办法,一查VS2005有一个类窗体弹出类(很强大的对象)ToolStripDropDown, 在使用此类的时候需要传递一个ToolStripControlHost类型的对象,还有个问题就是,TreeView 弹出了,会在它的上方出现了一条小白条,这个问题很棘手,不过如果你懂Win32那就一切OK了,好,我们看看这个类吧.
一:ComboBoxTreeView
客户端调用方法:
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);
}
开始写了一个,关键点是弹出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);
}
}
}
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 System.Windows.Forms.Design;
namespace WindowsApplication14
{
[DefaultProperty("Items")]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | (ToolStripItemDesignerAvailability.MenuStrip | ToolStripItemDesignerAvailability.ToolStrip))]
public class ToolStripComboBoxTreeView : ToolStripControlHost
{
#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("System.Windows.Forms.Design.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
}
}
附图:using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms.Design;
namespace WindowsApplication14
{
[DefaultProperty("Items")]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | (ToolStripItemDesignerAvailability.MenuStrip | ToolStripItemDesignerAvailability.ToolStrip))]
public class ToolStripComboBoxTreeView : ToolStripControlHost
{
#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("System.Windows.Forms.Design.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);
}