在C#中自定义控件的智能标签
首先大家来看看效果图:
这是自定义TextBox的智能标签,我们可以实现个性化设置,用来方便我们自定义自己的控件,下面就详细介绍整个过程。
1.先实现扩展TextBox的控件,我这里是定义了一个MyTextBox,继承自TextBox.下面请看代码:
public partial class MyTextBox : System.Windows.Forms.TextBox
{
/// <summary>
/// Windows消息,窗体创建的消息。
/// </summary>
private const int WM_CREATE = 0x0001;
private MyDataGridView gridViewName;
private string columnName;
/// <summary>
/// 显示在智能标签的属性
/// </summary>
public MyDataGridView GridViewName
{
get
{
return gridViewName;
}
set
{
gridViewName = value;
}
}
/// <summary>
/// 显示在智能标签的属性
/// </summary>
public string ColumnName
{
get
{
return columnName;
}
set
{
columnName = value;
}
}
public MyTextBox()
{
InitializeComponent();
}
/// <summary>
/// 重写窗体处理的消息
/// </summary>
/// <param name="m">消息</param>
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_CREATE://当TextBox刚创建的时候,就捕获该消息,然后将TextBox的文本清空。
this.Text = String.Empty;
break;
default://其他消息由父类处理。
base.WndProc(ref m);
break;
}
}
}
这样我们就完成了,一个简单的扩展控件。
2.下面要继承DesignerActionList类,这个类的作用是用于创建智能标记面板的项列表的类型。
而且重写GetSortedActionItems这个方法,下面请看代码:
public class MyTextBoxActionList:DesignerActionList
{
/// <summary>
/// 定一个要自定义标签的控件
/// </summary>
private MyTextBox _textBox;
public MyTextBoxActionList(IComponent component):base(component)
{
this._textBox = component as MyTextBox;
}
/// <summary>
/// 该控件的属性
/// </summary>
public MyDataGridView GridViewName
{
get
{
return _textBox.GridViewName;
}
set
{
_textBox.GridViewName = value;
}
}
/// <summary>
/// 该控件的属性
/// </summary>
public string ColumnName
{
get
{
return _textBox.ColumnName;
}
set
{
_textBox.ColumnName = value;
}
}
/// <summary>
/// 重写父类的方法,实现在智能标签显示的属性
/// </summary>
/// <returns></returns>
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionPropertyItem("GridViewName", "GridViewName"));
items.Add(new DesignerActionPropertyItem("ColumnName", "ColumnName"));
return items;
}
}
3.然后继承ParentControlDesigner这个类,它的作用是用来设置控件的行为。在代码中,我们要重写它的ActionLists的属性,在这个ActionLists添加我们上面定义的MyTextBoxActionList.这样就把控件的智能标签自定义了。
public class TextBoxDesigner : ParentControlDesigner
{
private DesignerActionListCollection _actionLists;
public override System.ComponentModel.Design.DesignerActionListCollection ActionLists
{
get
{
if (_actionLists == null)
{
_actionLists = new DesignerActionListCollection();
_actionLists.Add(new MyTextBoxActionList(this.Component));
}
return _actionLists;
}
}
}
4.最后一步就是,在我们扩展的MyTextBox的控件中,添加一个特性。
[Designer(typeof(OverrideControl.TextBoxDesigner))]
public partial class MyTextBox : System.Windows.Forms.TextBox
下面代码跟第一点一样。这样就完成了一个自定义控件的标签。