ページに配置されるサーバーコントロールを作成していaspx
ます。ユーザーがメニューオプションを選択すると、htmlコントロール(選択、入力など)が動的に追加されます。ユーザーコントロールを使用してそれを行うことはできますが、サーバーコントロールでそれを実行する方法がわかりません。
ダイナミックHTMLが既にページに配置された後、コントロールにダイナミックHTMLを追加する方法を教えてもらえますか?
ページに配置されるサーバーコントロールを作成していaspx
ます。ユーザーがメニューオプションを選択すると、htmlコントロール(選択、入力など)が動的に追加されます。ユーザーコントロールを使用してそれを行うことはできますが、サーバーコントロールでそれを実行する方法がわかりません。
ダイナミック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;
}
}