快速业务通道

用托管C++编写自定义Web组合控件

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

什么是自定义的组合控件

自定义的Web组合控件正如它名字说的那样:在单个控件中集成了一个或多个服务端程序及HTML控件。自定义的组合控件在功能上与用户控件非常类似,最大的不同之处是,它只存在于它自己的程序集中(或与其他控件共享),能被放在工具条中,并可提供它所包含控件的所见即所得视图方式。

另一方面,自定义Web组合控件比用户控件(user control)更加难创建,因为Visual Studio.NET的设计者们并没有提供可视化创建它们的任何工具,因此,问题是:为什么要用组合控件取代用户控件呢?当分发控件到多个Web程序或系统中时,如果使用自定义Web组合控件,情况要好得多,而用户控件最好用在不重视复用的地方,例如,如果只准备在你自己的网站中使用控件,那么用户控件可能会是更好的选择。基本上来说,你不得不在创建它所花的额外努力与从中所得到的可复用次数之间,作一权衡;同时,因为自定义组合控件只存在于它自己的程序集中,所以在每台电脑上,只需要一份拷贝,而用户控件则放置于Web程序集内,因此,必须存储在每一个使用它的Web网站上。

创建一个自定义Web组合控件

创建一个自定义Web组合控件的步骤,实质上与创建一个自定义的超类Web控件一样,本例中为SearchControl,第一件要做的事,是设计控件的外观,完成之后,看起来大致如图1所示。

用托管C++编写自定义Web组合控件

图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);
}

现在,有了基本的外观了,还可以添加一些功能。首先,需要一些属性,用于更新标签及文本框内的值,以下是属性的定义:

[Bindable(true), Category("Appearance"), DefaultValue("")]
__property void set_Value(String *value);
__property String *get_Value();
[Bindable(true), Category("Appearance"), DefaultValue("")]
__property void set_LabelText(String *value);
__property String *get_LabelText();
[Bindable(true), Category("Appearance"), DefaultValue("")]
__property void set_ButtonText(String *value);
__property String *get_ButtonText();

代码如下:

String *SearchControl::get_LabelText()
{
 this->EnsureChildControls();
 return label->Text;
}
void SearchControl::set_LabelText(String *value)
{
 this->Ens

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号