控件布局中的所有控件的类保护级别,他们对于外部调用者来说都是不可访问的,要解决这个问题,需要为每一个要公开的控件定义一个公共属性(最好是只读的,但是调用者可以设置他们的任何属性),要确保这些属性与他们所表示的控件的ID有不一样的名称。
用户控件定义方法:只需要定义一个公共的方法。
用户控件公开事件:需要回答一个问题是是否要返回事件特定的数据。传递或者不传递数据会影响控件及其客户端用来处理事件的事件处理程序的签名。如果不需要传递数据,那么可以使用标准的事件处理程序EventHandler。在这种情况下,一个名为DateChanged的公共事件是这样声明的:
public event EventHandler DateChanged;
还需要一个帮助函数在空间内部调用用户定义的事件处理程序。一般采用下面的方式
protected virtural void OnDateChanged(EventArgs e){
if(DateChanged != null){
DateChanged(this,e)}
}
在涉及到自定义的数据时,需要定义一个扩展了类EventArgs的特别数据结构,以及一个使用这种数据结构的新委托类型(delegate----一种安全的函数指针)最后控件公开的事件.
如果类引发多个事件,可以通过使用事件属性而不是事件字段来优化他们的存储方式。对于事件字段,编译器为事件委托的每一个实例生成一个字段,对于大量不常使用的事件来说是不能接受的。事件属性包含由事件访问器伴随的事件声明:
public event DateChangerHandler DateChanged{ add{ Events.AddHandler(eventDateChanged,value);} remove{ Events.RemoveHandler(eventDateChanged,Value);}}
所有用户控件-----即所有的ASCX文件引用的Asp.net元素都属于ASP名称空间