看了一下Net2.0的Sdk,于是就写下了这篇文章,2.0下复合控件的简单开发。文章是给初学者看的。。高手就跳过吧。
2.0下面多了个抽象类 CompositeControl,这个类是继承了WebControl的,并实现了INamingContainer,ICompositeControlDesignerAccessor接口。这个跟1.X有点不一样,当然,我们也可以继承WebControl来写复合控件。
其中:INamingContainer的作用是保证子控件的ID是唯一的。
ICompositeControlDesignerAccessor一看就知道是设计是用的。
2.0里面的一些复合控件,如Login,Wizard都是基础这个CompositeControl开发的。
CompositeControl重写了WebControl的Controls属性,DataBind方法。其中DataBind还有重载方法。
下面简单的写出一个注册复合控件,复合控件是包括TextBox,Button,RequiredFieldValidator,Label等。实现的功能有,用户提交时,客户端判断是否已录入用户名,邮箱。。提交后触发一个自定义的事件。小弟才疏学浅,如有问题,欢迎赐教。。。点击这里下载源码
代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Security.Permissions;
using System.ComponentModel;
namespace WebControls
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 获取控件事件的参数类。。
/// </summary>
public class SubmitEventArgs
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public SubmitEventArgs(string email, string name)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.email = email;
this.name = name;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public SubmitEventArgs()
{ }
private string email,name;
public string Email
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{
return email;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ email = value; }
}
![](/Images/OutliningIndicators/InBlock.gif)
public string Name
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{
return name;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{
name=value;
}
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 复合控件Register
/// </summary>
[ToolboxData("<{0}:Register runat=server></{0}:Register>")]
[DefaultEvent("Submit")]
[DefaultProperty("ButtonText")]
public class Register : CompositeControl
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public Register()
{ }
![](/Images/OutliningIndicators/InBlock.gif)
public Button submitButton, resetButton;
private TextBox nameTextBox, emailTextBox;
private Label nameLabel, emailLabel;
private RequiredFieldValidator emailValidator, nameValidator;
private static readonly object EventSubmitKey = new object();
![](/Images/OutliningIndicators/InBlock.gif)
public delegate void SubmiteEventHandler(object sender, SubmitEventArgs e);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
"Property"#region"Property"
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("登入")]
[Description("登入按钮的标签文字")]
public string SubmitButtonText
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return submitButton.Text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
submitButton.Text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("注册帐户")]
public string Name
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return nameTextBox.Text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
nameTextBox.Text = value;
}
}
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("帐户错误信息")]
public string NameErrorMessage
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return nameValidator.ErrorMessage;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
nameValidator.ErrorMessage = value;
nameValidator.ToolTip = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("帐户")]
[Description("帐户标签")]
public string NameLabelText
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return nameLabel.Text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
nameLabel.Text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("邮件")]
public string Email
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return emailTextBox.Text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
emailTextBox.Text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("邮件错误信息")]
public string EmailErrorMessage
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return emailValidator.ErrorMessage;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
emailValidator.ErrorMessage = value;
emailValidator.ToolTip = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("邮件")]
[Description("邮件标签名称")]
public string EmailLabelText
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
return emailLabel.Text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
EnsureChildControls();
emailLabel.Text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
"Event"#region"Event"
[Category("Action")]
[Description("Raised When the user clicks the button")]
public event SubmiteEventHandler Submit
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
add
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Events.AddHandler(EventSubmitKey, value);
}
remove
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Events.RemoveHandler(EventSubmitKey, value);
}
}
![](/Images/OutliningIndicators/InBlock.gif)
protected void OnSubmit(EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SubmiteEventHandler submitHandler = (SubmiteEventHandler)Events[EventSubmitKey];
if (submitHandler != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
submitHandler(this, new SubmitEventArgs(this.Email, this.Name));
}
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 2.0新增的方法。。
/// </summary>
protected override void RecreateChildControls()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
base.RecreateChildControls();
EnsureChildControls();
}
![](/Images/OutliningIndicators/InBlock.gif)
protected override void CreateChildControls()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Controls.Clear();
nameLabel = new Label();
nameTextBox = new TextBox();
nameTextBox.ID = "nameTextbox";
![](/Images/OutliningIndicators/InBlock.gif)
nameValidator = new RequiredFieldValidator();
nameValidator.ID = "validator1";
nameValidator.ControlToValidate = nameTextBox.ID;
nameValidator.Text = "帐户不能为空";
nameValidator.Display = ValidatorDisplay.Static;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
emailLabel = new Label();
emailTextBox = new TextBox();
emailTextBox.ID = "emailTextBox";
![](/Images/OutliningIndicators/InBlock.gif)
emailValidator = new RequiredFieldValidator();
emailValidator.ID = "validator2";
emailValidator.ErrorMessage = "邮件不能为空";
emailValidator.ControlToValidate = emailTextBox.ID;
emailValidator.Display = ValidatorDisplay.Static;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
submitButton = new Button();
submitButton.ID = "button1";
submitButton.Text = "登入";
submitButton.ValidationGroup = this.ID;
nameValidator.ValidationGroup = this.ID;
emailValidator.ValidationGroup = this.ID;
submitButton.Click += new EventHandler(submitButton_Click);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
Controls.Add(nameLabel);
Controls.Add(nameTextBox);
Controls.Add(nameValidator);
Controls.Add(emailLabel);
Controls.Add(emailTextBox);
Controls.Add(emailValidator);
Controls.Add(submitButton);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
void submitButton_Click(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
OnSubmit(e);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
protected override void RenderContents(HtmlTextWriter writer)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// base.RenderContents(writer);
AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%");
writer.AddAttribute(HtmlTextWriterAttribute.Border, "1");
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "1", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameLabel.RenderControl(writer);
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameTextBox.RenderControl(writer);
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameValidator.RenderControl(writer);
writer.Write(" ");
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailLabel.RenderControl(writer);
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailTextBox.RenderControl(writer);
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailValidator.RenderControl(writer);
writer.Write(" ");
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2", false);
writer.AddAttribute(HtmlTextWriterAttribute.Align, "right", false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
submitButton.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(" ");
writer.RenderEndTag();
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
writer.RenderEndTag();
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)
我是直接放入App_Code文件夹里面的。这样做的好处是不用编译都可以调用。
测试页default.aspx,代码如下:
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Register TagPrefix="index" Namespace="WebControls" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
![](/Images/OutliningIndicators/None.gif)
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<index:Register runat=server EmailLabelText="邮件" ID=reg NameLabelText="名称" SubmitButtonText="登入" Email="Genson_diy@sina.com" OnSubmit="reg_Submit" />
</form>
</body>
</html>
![](/Images/OutliningIndicators/None.gif)
cs 代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using WebControls;
public partial class _Default : System.Web.UI.Page
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
protected void Page_Load(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](/Images/OutliningIndicators/InBlock.gif)
protected void reg_Submit(object sender, SubmitEventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Response.Write(e.Name + e.Email);
}
}
![](/Images/OutliningIndicators/None.gif)