Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 网页编程 / ASP.NET / ASP.NET服务器控件开发(4)--复合控件

ASP.NET服务器控件开发(4)--复合控件2011-03-19概念:

所谓复合控件:简单的理解就是将多个基本的控件组合成一个控件,从而实现自己想要的效果。微软为ASP.NET2.0中推出的登录控件等就是一个复合控件。从功能的实现上,复合式控件有点像用户控件,只是一个是.ascx文件,一个是.dll文件。

呈现简单的复合控件:

要想呈现一个复合控件,需要了解以下几个方面:

-->实现INamingContainer接口。

任何实现该接口的控件都创建一个新的命名空间,在这个新的命名空间中,所有子控件 ID 属性在整个应用程序内保证是唯一的。

-->Control.CreateChildControls 方法。

由 ASP.NET 页面框架调用,以通知使用基于合成的实现的服务器控件创建它们包含的任何子控件,以便为回发或呈现做准备。 当开发复合服务器控件或模板服务器控件时,必须重写此方法。重写 CreateChildControls 方法的控件应实现 INamingContainer 接口以避免命名冲突。

-->Control.ChildControlsCreated 属性。

获取一个值,该值指示是否已创建服务器控件的子控件。

-->Control.EnsureChildControls 方法。

确定服务器控件是否包含子控件。如果不包含,则创建子控件。

下面就通过实例来呈现个简单的复合登陆控件:创建ASP.NET服务器控件工程。complexControl。

先来看代码:

namespace complexControl
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:LoginControl runat=server ButtonText="登录" NameLabel="用户名:" PasswordLabel="用户密码:"></{0}:LoginControl>")]
public class LoginControl : WebControl, INamingContainer
{
private Button _button;
private TextBox _nameTextBox;
private Label _nameLabel;
private TextBox _passwordTextBox;
private Label _passwordLabel;
private RequiredFieldValidator _nameValidator;
private RequiredFieldValidator _passwordValidator;


[Bindable(true),Category("Appearance"),DefaultValue(""),Description("按钮文本")]
public string ButtonText
{
get
{
EnsureChildControls();//确定服务器控件是否包含子控件
return _button.Text;
}
set
{
EnsureChildControls();
_button.Text = value;
}
}

[Bindable(true),Category("Default"),DefaultValue(""),Description("姓名")]
public string Name
{
get
{
EnsureChildControls();
return _nameTextBox.Text;
}
set
{
EnsureChildControls();
_nameTextBox.Text = value;
}
}

[Bindable(true),Category("Appearance"),DefaultValue(""),Description("必须输入姓名")]
public string NameErrorMessage
{
get
{
EnsureChildControls();
return _nameValidator.ErrorMessage;
}
set
{
EnsureChildControls();
_nameValidator.ErrorMessage = value;
_nameValidator.ToolTip = value;
}
}

[Bindable(true),Category("Apperance"),DefaultValue(""),Description("姓名标签")]
public string NameLabel
{
get
{
EnsureChildControls();
return _nameLabel.Text;
}
set
{
EnsureChildControls();
_nameLabel.Text = value;

}
}

[Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public string Password
{
get
{
EnsureChildControls();
return _passwordTextBox.Text;
}
}

[Bindable(true),Category("Appearance"),DefaultValue(""),Description("必须输入密码")]
public string PasswordErrorMessage
{
get
{
EnsureChildControls();
return _passwordValidator.ErrorMessage;
}
set
{
EnsureChildControls();
_passwordValidator.ErrorMessage = value;
_passwordValidator.ToolTip = value;
}
}

[Bindable(true),Category("Appearance"),DefaultValue(""),Description("密码标签")]
public string PasswordLabel
{
get
{
EnsureChildControls();
return _passwordLabel.Text;
}
set
{
EnsureChildControls();
_passwordLabel.Text = value;

}
}

protected override void CreateChildControls()
{
Controls.Clear();

_nameLabel = new Label();

_nameTextBox = new TextBox();
_nameTextBox.ID = "nameTextBox";

_nameValidator = new RequiredFieldValidator();
_nameValidator.ID = "validator1";
_nameValidator.ControlToValidate = _nameTextBox.ID;
_nameValidator.Text = "*";
_nameValidator.Display = ValidatorDisplay.Static;

_passwordLabel = new Label();

_passwordTextBox = new TextBox();
_passwordTextBox.TextMode = TextBoxMode.Password;
_passwordTextBox.ID = "passwordTextBox";

_passwordValidator = new RequiredFieldValidator();
_passwordValidator.ID = "validator2";
_passwordValidator.ControlToValidate = _passwordTextBox.ID;
_passwordValidator.Text = "*";
_passwordValidator.Display = ValidatorDisplay.Static;

_button = new Button();
_button.ID = "button1";

this.Controls.Add(_nameLabel);
this.Controls.Add(_nameTextBox);
this.Controls.Add(_nameValidator);
this.Controls.Add(_passwordLabel);
this.Controls.Add(_passwordTextBox);
this.Controls.Add(_passwordValidator);
this.Controls.Add(_button);
}

protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);

writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,
"1", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_nameLabel.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_nameTextBox.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_nameValidator.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderEndTag(); // Tr

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_passwordLabel.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_passwordTextBox.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_passwordValidator.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderEndTag(); // Tr

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
writer.AddAttribute(HtmlTextWriterAttribute.Align, "right");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_button.RenderControl(writer);
writer.RenderEndTag(); // Td
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("&nbsp;");
writer.RenderEndTag(); // Td
writer.RenderEndTag(); // Tr

writer.RenderEndTag(); // Table
}

}
}