什么是自定义的组合控件
自定义的Web组合控件正如它名字说的那样:在单个控件中集成了一个或多个服务端程序及HTML控件。自定义的组合控件在功能上与用户控件非常类似,最大的不同之处是,它只存在于它自己的程序集中(或与其他控件共享),能被放在工具条中,并可提供它所包含控件的所见即所得视图方式。
另一方面,自定义Web组合控件比用户控件(user control)更加难创建,因为Visual Studio.NET的设计者们并没有提供可视化创建它们的任何工具,因此,问题是:为什么要用组合控件取代用户控件呢?当分发控件到多个Web程序或系统中时,如果使用自定义Web组合控件,情况要好得多,而用户控件最好用在不重视复用的地方,例如,如果只准备在你自己的网站中使用控件,那么用户控件可能会是更好的选择。基本上来说,你不得不在创建它所花的额外努力与从中所得到的可复用次数之间,作一权衡;同时,因为自定义组合控件只存在于它自己的程序集中,所以在每台电脑上,只需要一份拷贝,而用户控件则放置于Web程序集内,因此,必须存储在每一个使用它的Web网站上。
创建一个自定义Web组合控件
创建一个自定义Web组合控件的步骤,实质上与创建一个自定义的超类Web控件一样,本例中为SearchControl,第一件要做的事,是设计控件的外观,完成之后,看起来大致如图1所示。
图1:设计器中的控件外观
SearchControl,正如上面所看到的,由三个服务端控件组成(实际上有四个,后面将会说到):一个标签控件、一个文本框控件、一个按钮。另外,自定义Web组合控件中比较棘手的部分是它们并没有一个很好的拖放设计工具以支持创建控件,而需要以老方式--手工编写代码来完成。但是,也不完全正确,在此不必手工编写服务端或HTML控件代码,那怎样创建SearchControl的外观呢?
首先,在SearchControl类中写出三个服务端控件的定义:
Label *label;
TextBox *textbox;
Button *button;
接下来,在类的构造函数中创建它们的实例:
SearchControl::SearchControl()
{
label = new Label();
textbox = new TextBox();
button = new Button();
}
最后,在类的CreateChildControls()方法中,把它们添加到一个自定义Web组合控件的子控件集合里:
void SearchControl::CreateChildControls()
{
Controls->Add(label);
Controls->Add(textbox);
Controls->Add(button);
}
CreateChildControls()方法是从Control类继承来的一个虚方法,而WebControl也正是从Control类继承而来。
注意,在此并不需要Render()方法,因为组成组合控件的服务端与HTML控件能绘制自身,所以,你完全不用考虑此方法,或者在Render()方法中调用基类:
void SearchControl::Render(HtmlTextWriter *output)
{
__super::Render(output);
}