0

我正在创建一个将位于aspx页面中的服务器控件。当用户选择菜单选项时,将动态添加 html 控件(选择、输入等)。我可以使用用户控件来做到这一点,但我不确定如何在服务器控件中进行操作。

谁能告诉我如何在控件已经位于页面中后将动态 html 添加到控件中?

4

1 回答 1

2

由于您计划添加多个控件作为服务器控件的输出,因此您应该考虑从CompositeControl继承,该控件旨在与多个组成控件一起使用,从而最大限度地减少执行常见操作(如保持状态和处理组成控件事件)所需的代码

您需要覆盖CreateChildControls以添加子控件。在此方法结束时,您应该使用this.ChildControlsCreated = true;来指定是否创建了子控件,这是必要的,因为在ASP.Net 页面生命周期CreateChildControls期间会多次调用

您需要应用通常应用于任何服务器控件的相同规则,例如实现INamingContainer接口以确保子控件将具有唯一的客户端 ID

这是一个简单的例子:

[DefaultProperty("UserText")]
[ToolboxData(@"<{0}:UserPassword runat=server UserText="""" PasswordText="""" />")]
public class UserPassword : CompositeControl
{
    public event EventHandler Submitted = delegate { };

    [Bindable(true)]
    [Category("Appearance")]
    [Description("User text")]
    [DefaultValue("")]
    [Localizable(true)]
    public string UserText
    {
        get
        {
            var t = this.FindControl("Username") as TextBox;
            return t.Text;
        }
        set
        {
            var t = this.FindControl("Username") as TextBox;
            t.Text = value;
        }
    }

    [Bindable(true)]
    [Category("Appearance")]
    [Description("Password text")]
    [DefaultValue("")]
    [Localizable(true)]
    public string PasswordText
    {
        get
        {
            var t = this.FindControl("Password") as TextBox;
            return t.Text;
        }
        set
        {
            var t = this.FindControl("Password") as TextBox;
            t.Text = value;
        }
    }

    protected override void CreateChildControls()
    {
        var p = new Panel { Width= new Unit(200), BackColor = Color.Silver };
        var ul = new Label { Text = "Username: " };
        var u = new TextBox { ID = "Username" };
        var pal = new Label { Text = "Password: " };
        var pa = new TextBox { ID = "Password", TextMode = TextBoxMode.Password };
        var l = new Literal { Text = "<br />" };
        var b = new Button { Text = "Log in" };

        b.Click += (x, y) => this.Submitted(x, y);

        p.Controls.Add(ul);
        p.Controls.Add(u);
        p.Controls.Add(l);
        p.Controls.Add(pal);
        p.Controls.Add(pa);
        p.Controls.Add(l);
        p.Controls.Add(l);
        p.Controls.Add(b);

        this.Controls.Add(p);
        this.ChildControlsCreated = true;
    }
}
于 2012-07-29T19:41:44.637 回答