首页 > 代码库 > DIY-自定义控件

DIY-自定义控件

  1. VS为我们提供了大量的零碎的控件,供我们使用,但也是因为这些控件太过零碎,我们想要一些控件的组合,既然有了这种需求,那么也就一定有了这种供求,自定义控件和用户控件应运而生。
  1. 之前我们已经学过用户控件,http://blog.csdn.net/tgbsqliuying/article/details/40926591
    1. 两者区别
      1. 用户控件往往是从属于某个程序集的,并且,事件和属性都是封装在用户控件的内部,在外部往往不可对整个控件的某个成员进行操作。与其所属的程序共用一个大的环境。
      1. 自定义控件具有暴露在外界的属性和方法,并且以组件的方式供所有VS程序使用,不分编写程序的语言。相比之下,自定义控件就强大多了。

 

  1. 自定义控件的制作示例
    1. 推荐学习博客:http://blog.csdn.net/smallfools/article/details/5637393 写得超级不错
    1. 记得原来学习C#的时候,学到"C#中有且仅有类构成",那么C#中的控件,自然也是由类构成。类的成员变量有:字段,属性,方法,静态方法,构造函数….

那么具体到一个控件类,我们最常用的就是它的属性和方法。

  1. 在学生基础项目中,我遇到这样一个问题:就是公告详情的显示页面和任务的显示页面是非常相似的,只是有些细节不太一样。如下图所示:
    1. 那么我们是否可以将公告任务的所有成员(标题,发布时间,任务进度,公告任务的查看人,公告任务的发布人)封装为一个控件,将所有成员,作为此控件的属性,那么此控件,就可以被多个任务公告付赋值了。答案当然是可以的。

 

  

  1. 先来学习自定义控件:
    1. 那么如何定义一个控件的属性呢? 

              

<pre name="code" class="csharp">  //框架
        private Panel _pframe = new Panel();
 
        //框架宽
        private Int16 _fwidth;
        [Bindable(true)]
        [Category("Data")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int16 Fwidth
        {
            get { return _fwidth; }
            set { _fwidth = value; }
        }
        //框架高
        private Int16 _fheight;
        [Bindable(true)]
        [Category("Data")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int16 Fheight
        {
            get { return _fheight; }
            set { _fheight = value; }
        }
        #endregion



 

 

  1. 那么如何定义一个控件的方法呢?

任务需要编辑进度,所以我们需要将进度选择框的SelectedIndexChanged方法,

<pre name="code" class="csharp">        //进度条改变的事件,属性访问权限为Public,所以此事件是此用户的控件。
        public event EventHandlerSelectedIndexChanged;
 


我们都知道,事件代码并不是已经在程序中定义好了,只有我们需要此事件时,我们才需要双击此控件,或者选择事件驱动,自动生成事件驱动代码,然后我们补充方法体,自定义控件,也提供了,这个机制:

           

<pre name="code" class="csharp">this._dpSchedule.SelectedIndexChanged += newEventHandler(this._dpSchedule_SelectedIndexChanged);
       //cmbox item改变事件
        private void_dpSchedule_SelectedIndexChanged(object sender, EventArgs e)
        {
            EventArgs e1 = new EventArgs();
            if (this.SelectedIndexChanged !=null)
               this.SelectedIndexChanged(SelectedIndexChanged, e1);
        }


 

 

 

因为自定义控件属于一个自定义控件程序,所以此程序经编译,可以生成dll组件,在工具箱引用,就能见到,使用的过程,跟VS自带控件无异。大家可以尝试一下。

DIY-自定义控件