CompositeLogin.cs using System;using System.Collections.Generic;using System.ComponentModel;using System.Text;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace myControl...{ [DefaultProperty("Text")] [ToolboxData("<{0}:CompositeLogin runat='server'></{0}:CompositeLogin>")] public class CompositeLogin : WebControl,INamingContainer ...{ Text attribute#region Text attribute [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Text ...{ get ...{ String s = (String)ViewState["Text"]; return ((s == null) ? String.Empty : s); } set ...{ ViewState["Text"] = value; } } #endregion private TextBox _nameTextbox; private TextBox _passwordTextbox; private Label _nameLabel; private Label _passwordLabel; private Button _button; private RequiredFieldValidator _namevalidator; private RequiredFieldValidator _passwordValidator; private static readonly object EventLogin = new object(); Override Properties#region Override Properties public override ControlCollection Controls ...{ get ...{ EnsureChildControls(); return base.Controls; } } #endregion Override Properties Properties delegate to child controls#region Properties delegate to child controls public string ButtonText ...{ get ...{ EnsureChildControls(); return _button.Text; } set ...{ EnsureChildControls(); this._button.Text = value; } } public string Name ...{ get ...{ EnsureChildControls(); return this._nameTextbox.Text; } set ...{ this._nameTextbox.Text = value; } } public string NameErrorMessage ...{ get ...{ EnsureChildControls(); return this._namevalidator.ErrorMessage; } set ...{ EnsureChildControls(); _namevalidator.ErrorMessage = value; _namevalidator.ToolTip = value; } } public string NameLabel ...{ get ...{ EnsureChildControls(); return this._nameLabel.Text; } set ...{ EnsureChildControls(); this._nameLabel.Text = value; } } public string Password ...{ get ...{ EnsureChildControls(); return this._passwordTextbox.Text; } } public string PasswordErrorMessage ...{ get ...{ EnsureChildControls(); return this._passwordValidator.ErrorMessage; } set ...{ EnsureChildControls(); this._passwordValidator.ErrorMessage = value; this._passwordValidator.ToolTip = value; } } public string PasswordLabel ...{ get ...{ EnsureChildControls(); return this._passwordLabel.Text; } set ...{ EnsureChildControls(); this._passwordLabel.Text = value; } } #endregion Event#region Event public event EventHandler Login ...{ add ...{ Events.AddHandler(EventLogin, value); } remove ...{ Events.RemoveHandler(EventLogin, value); } } protected virtual void OnLogion(EventArgs e) ...{ EventHandler onlogionEvent = (EventHandler)Events[EventLogin]; if (onlogionEvent != null) ...{ onlogionEvent(this, e); } } //??????????????????????? protected override bool OnBubbleEvent(object source, EventArgs args) ...{ bool handled = false; if (args is CommandEventArgs) ...{ CommandEventArgs ce=(CommandEventArgs)args; if(ce.CommandName=="Logon")...{ OnLogion(EventArgs.Empty); handled=true; } } return handled; } //??????????????????????? #endregion Override CreateChildControls#region Override CreateChildControls protected override void CreateChildControls() ...{ base.CreateChildControls(); Controls.Clear(); _nameLabel = new Label(); _passwordLabel = new Label(); _nameTextbox = new TextBox(); _passwordTextbox = new TextBox(); _nameTextbox.ID = "nametextbox"; _passwordTextbox.ID = "pswtextbox"; _passwordTextbox.TextMode = TextBoxMode.Password; _passwordValidator = new RequiredFieldValidator(); _namevalidator = new RequiredFieldValidator(); _passwordValidator.ID = "val1"; _passwordValidator.ControlToValidate = _passwordTextbox.ID; _passwordValidator.Text = "*"; _passwordValidator.Display = ValidatorDisplay.Static; _namevalidator.ID = "val2"; _namevalidator.ControlToValidate = _nameTextbox.ID; _namevalidator.Text = "*"; _namevalidator.Display = ValidatorDisplay.Static; _button = new Button(); _button.ID = "button1"; _button.CommandName = "Logon"; this.Controls.Add(_nameLabel); this.Controls.Add(_passwordLabel); this.Controls.Add(_nameTextbox); this.Controls.Add(_passwordTextbox); this.Controls.Add(_namevalidator); this.Controls.Add(_passwordValidator); this.Controls.Add(_button); } #endregion Override Render#region Override Render protected override void Render(HtmlTextWriter writer) ...{ //base.Render(writer); AddAttributesToRender(writer); writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "1", false); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); _nameLabel.RenderControl(writer); //label name writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Td); _nameTextbox.RenderControl(writer); //textbox name writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Td); _namevalidator.RenderControl(writer); //* writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); _passwordLabel.RenderControl(writer); //label psw writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Td); _passwordTextbox.RenderControl(writer); //textbox psw writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Td); _passwordValidator.RenderControl(writer); //* writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Align, "right"); writer.RenderBeginTag(HtmlTextWriterTag.Td); _button.RenderControl(writer); //button submit writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderEndTag(); } #endregion }} 样式如下: //??????????内的方法不知道什么作用??