我正在创建一个将位于aspx
页面中的服务器控件。当用户选择菜单选项时,将动态添加 html 控件(选择、输入等)。我可以使用用户控件来做到这一点,但我不确定如何在服务器控件中进行操作。
谁能告诉我如何在控件已经位于页面中后将动态 html 添加到控件中?
我正在创建一个将位于aspx
页面中的服务器控件。当用户选择菜单选项时,将动态添加 html 控件(选择、输入等)。我可以使用用户控件来做到这一点,但我不确定如何在服务器控件中进行操作。
谁能告诉我如何在控件已经位于页面中后将动态 html 添加到控件中?
由于您计划添加多个控件作为服务器控件的输出,因此您应该考虑从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;
}
}