- VS为我们提供了大量的零碎的控件,供我们使用,但也是因为这些控件太过零碎,我们想要一些控件的组合,既然有了这种需求,那么也就一定有了这种供求,自定义控件和用户控件应运而生。
- 之前我们已经学过用户控件,http://blog.csdn.net/tgbsqliuying/article/details/40926591
- 两者区别
- 用户控件往往是从属于某个程序集的,并且,事件和属性都是封装在用户控件的内部,在外部往往不可对整个控件的某个成员进行操作。与其所属的程序共用一个大的环境。
- 自定义控件具有暴露在外界的属性和方法,并且以组件的方式供所有VS程序使用,不分编写程序的语言。相比之下,自定义控件就强大多了。
- 两者区别
- 自定义控件的制作示例
- 推荐学习博客:http://blog.csdn.net/smallfools/article/details/5637393 写得超级不错
- 记得原来学习C#的时候,学到"C#中有且仅有类构成",那么C#中的控件,自然也是由类构成。类的成员变量有:字段,属性,方法,静态方法,构造函数….
那么具体到一个控件类,我们最常用的就是它的属性和方法。
- 在学生基础项目中,我遇到这样一个问题:就是公告详情的显示页面和任务的显示页面是非常相似的,只是有些细节不太一样。如下图所示:
- 那么我们是否可以将公告任务的所有成员(标题,发布时间,任务进度,公告任务的查看人,公告任务的发布人)封装为一个控件,将所有成员,作为此控件的属性,那么此控件,就可以被多个任务公告付赋值了。答案当然是可以的。
- 先来学习自定义控件:
- 那么如何定义一个控件的属性呢?
<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
- 那么如何定义一个控件的方法呢?
任务需要编辑进度,所以我们需要将进度选择框的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自带控件无异。大家可以尝试一下。
时间: 2024-12-29 23:30:41