科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET 2.0服务器控件之复合控件概述(2)

ASP.NET 2.0服务器控件之复合控件概述(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文重点介绍有关复合控件的概念、创建方法等理论,然后,通过一个典型示例加深读者对于复合控件创建方法的理解。

作者:金属边缘 来源:天极开发 2007年11月6日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
// 实现属性EmailErrorMessage

[
 Bindable(true),
 Category("Appearance"),
 DefaultValue(""),
 Description("邮件地址验证错误信息.")
]

public string EmailErrorMessage {
 get {
  EnsureChildControls();
  return emailValidator.ErrorMessage;
 }
 set {
  EnsureChildControls();
  emailValidator.ErrorMessage = value;
  emailValidator.ToolTip = value;
 }
}

// 实现属性EmailLabelText

[
 Bindable(true),
 Category("Appearance"),
 DefaultValue(""),
 Description("电子邮件文本框旁的文字.")
]

public string EmailLabelText {
 get {
  EnsureChildControls();
  return emailLabel.Text;
 }
 set {
  EnsureChildControls();
  emailLabel.Text = value;
 }
}

// 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法

protected override void RecreateChildControls() {
 EnsureChildControls();
}

// 重写Control基类的CreateChildControls方法

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 = NameErrorMessage;
 nameValidator.Display = ValidatorDisplay.Static;
 emailLabel = new Label();
 emailTextBox = new TextBox();
 emailTextBox.ID = "emailTextBox";
 emailValidator = new RequiredFieldValidator();
 emailValidator.ID = "validator2";
 emailValidator.ControlToValidate = emailTextBox.ID;
 emailValidator.Text = EmailErrorMessage;
 emailValidator.Display = ValidatorDisplay.Static;
 submitButton = new Button();
 submitButton.ID = "button1";
 this.Controls.Add(nameLabel);
 this.Controls.Add(nameTextBox);
 this.Controls.Add(nameValidator);
 this.Controls.Add(emailLabel);
 this.Controls.Add(emailTextBox);
 this.Controls.Add(emailValidator);
 this.Controls.Add(submitButton);
}

// 重写Render方法

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();
 writer.RenderBeginTag(HtmlTextWriterTag.Td);
 nameTextBox.RenderControl(writer);
 writer.RenderEndTag();
 writer.RenderBeginTag(HtmlTextWriterTag.Td);
 nameValidator.RenderControl(writer);
 writer.RenderEndTag();
 writer.RenderEndTag();
 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
 writer.RenderBeginTag(HtmlTextWriterTag.Td);
 emailLabel.RenderControl(writer);
 writer.RenderEndTag();
 writer.RenderBeginTag(HtmlTextWriterTag.Td);
 emailTextBox.RenderControl(writer);
 writer.RenderEndTag();
 writer.RenderBeginTag(HtmlTextWriterTag.Td);
 emailValidator.RenderControl(writer);
 writer.RenderEndTag();
 writer.RenderEndTag();
 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();
 writer.RenderEndTag();
}
}
}
  以上列举了复合控件类Register的源代码。虽然代码有些冗长,然而还是比较容易理解的。下图1列举了Register类结构图。


图1 类结构图

  如图1并结合代码可知,Register类继承自CompositeControl基类,其实现了7个属性和3个方法。属性包括ButtonText、Email、EmailErrorMessage、EmailLabelText、Name、NameErrorMessage和NameLabelText。这些属性通过命名,相信读者基本可以了解其意义。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章