在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

下面代码跟第一点一样。这样就完成了一个自定义控件的标签。

 

posted @ 2009-06-23 09:42  桑叶舟  阅读(2491)  评论(3编辑  收藏  举报