最进在使用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
System.Windows.Forms.Design;

namespace
WindowsApplication14

{
[DefaultProperty(
"
Items
"
)]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip
|
(ToolStripItemDesignerAvailability.MenuStrip
|
ToolStripItemDesignerAvailability.ToolStrip))]
public
class
ToolStripComboBoxTreeView : ToolStripControlHost

{

ToolStripComboBoxTreeViewControl
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("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);