科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: 服务器控件 复合控件 Windows

  • 评论
  • 分享微博
  • 分享邮件
典型应用

  上文介绍了有关创建复合控件的一些基本知识,下面将通过一个典型应用加深读者对于复合控件实现方法的理解,其重点放在针对复合控件的呈现方法上。

  多数控件呈现通过重写Render方法实现,然而,在复合控件中则大有不同。复合控件由多个子控件组合而成,其呈现逻辑是由子控件提供的。

  据此,在少数较为简单的情况下,复合控件不用重写Render方法,例如,创建一个包含文本框和按钮的复合控件,这时,只要通过类撰写的方法在CreateChildControls中添加相关控件即可,而无需Render方法。但是,在多数情况下,复合控件中既包含子控件,又包含用于格式化和布局的HTML。

  针对这种情况,如果只采取类撰写的实现方法,那么很容易造成错误,并且生成的复合控件性能受到很大影响。最好的解决方法是重写CreateChildControls方法,同时也重写Render方法。在CreateChildControls方法中,为复合控件添加子控件;在Render方法中,为HTTP输出流添加用于格式化和布局的HTML。

  下面列举了呈现复合控件的关键步骤:

  · 控件基类继承自CompositeControl基类。这是在ASP.NET 2.0中创建复合控件的关键所在。

  · 重写CreateChildControls方法,完成实例化、初始化子控件,并且将子控件添加到控件集合中。

  · 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法。

  · 如果复合控件中存在用于格式化和布局的HTML,那么建议将这些内容写入Render方法中,而不要在CreateChildControls方法中创建和添加所需的LiteralControl实例。另外,在添加相关HTML代码过程中,为了让子控件使用默认生成方法,必须使每个子控件调用RenderControl方法。

  为了便于读者更好的理解以上内容,下面举例说明。在此示例中,Register控件使用子控件创建用户界面(UI),用于输入用户信息,以向网站注册。此用户界面包括两个TextBox控件(一个用于输入用户名,另一个用于输入用户的电子邮件地址)和一个用于提交信息的Button控件。Register还将RequiredFieldValidator控件与两个TextBox控件关联起来,以确保用户输入了名称和电子邮件地址。复合控件Register源代码如下所示:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary{
[
 DefaultProperty("ButtonText"),
 ToolboxData("<{0}:Register runat=\"server\"> </{0}:Register>"),
]

public class Register : CompositeControl {
// 定义私有字段
private Button submitButton;
private TextBox nameTextBox;
private Label nameLabel;
private TextBox emailTextBox;
private Label emailLabel;
private RequiredFieldValidator emailValidator;
private RequiredFieldValidator nameValidator;
// 实现属性ButtonText

[
 Bindable(true),
 Category("Appearance"),
 DefaultValue(""),
 Description("按钮上的文字内容.")
]

public string ButtonText {
 get {
  EnsureChildControls();
  return submitButton.Text;
 }
 set {
  EnsureChildControls();
  submitButton.Text = value;
 }
}

// 实现属性Name

[
 Bindable(true),
 Category("Default"),
 DefaultValue(""),
 Description("用户名.")
]

public string Name {
 get {
  EnsureChildControls();
  return nameTextBox.Text;
 }
 set {
  EnsureChildControls();
  nameTextBox.Text = value;
 }
}

// 实现属性NameErrorMessage

[
 Bindable(true),
 Category("Appearance"),
 DefaultValue(""),
 Description("用户名验证错误信息.")
]

public string NameErrorMessage {
 get {
  EnsureChildControls();
  return nameValidator.ErrorMessage;
 }
 set {
  EnsureChildControls();
  nameValidator.ErrorMessage = value;
  nameValidator.ToolTip = value;
 }
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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