0

動的コントロールでいくつかのテストを行っています。ここにコード:

ASPXページ

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
            onselectedindexchanged="DropDownList1_SelectedIndexChanged">
            <asp:ListItem Value="0">Nothing</asp:ListItem>
            <asp:ListItem Value="1">Two buttons</asp:ListItem>
        </asp:DropDownList>
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>
    </div>
    </form>
</body>
</html>

コードビハインド:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["CreateDynamicButton"] != null)
        {
            CreateControls();
        }
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        CreateControls();
    }

    void Button_Click(object sender, EventArgs e)
    {
        Button b = (Button)sender;

        Response.Write("You clicked the button with ID " + b.ID);
    }

    private void CreateControls()
    {
        if (DropDownList1.SelectedValue.Equals("1"))
        {
            Panel1.Controls.Clear();

            Button b1 = new Button();
            b1.ID = "b1";
            b1.Text = "Button 1";

            Button b2 = new Button();
            b2.ID = "b2";
            b2.Text = "Button 2";

            b1.Click += new EventHandler(Button_Click);
            b2.Click += new EventHandler(Button_Click);

            Panel1.Controls.Add(b1);
            Panel1.Controls.Add(b2);

            ViewState["CreateDynamicButton"] = true;
        }
    }
}

このコードは機能しますが、ご覧Panel1.Controlsのとおり、ボタンを追加する前にすべてのコントロールを削除します。これは、2 回目の作成を選択したときに、重複したコントロール ID の例外が発生するためです。

2 つのボタンの場合、操作は非常に高速であると思いますが、コントロールの数が増えると、精緻化の時間が長くなります。この回避策を使用せずに PostBack 後にコントロールを再生成するより良い方法を教えてください。

4

2 に答える 2

0

手始めに、コントロール (この場合はボタン) を永久に削除しようとしている場合、Dispose メソッドを使用するのが最善でしょうか? コントロールのパネルをクリアしても、それは破棄されません。これは、既に使用されている ID を説明します。パネル内のコントロールの数に関係なく、単純なループを実行してこれを行うことができます。

foreach(Control control in Container)
{
  control.Dispose();
}

また、ボタンを作成するには、btn1、btn2 などの名前を付けているだけです。これもループで行うことができます。

for(int i = 0; i >= yourInt; i++)
{
  Button b = new Button();
  b.ID = "b" + i;
  b.Text = "Button " + i;
}

}

于 2013-01-15T12:58:30.923 に答える
0

メソッドでクラス変数を作成し、チェックしprivate bool ControlsCreated = false; ますCreateControls

if (!ControlsCreated) {
    //your code to create controls
}

これにより、コントロールが 1 回だけ作成されるようになります。後でコントロールを再作成する必要がある場合 (ドロップダウンリストの値が変更された場合) は、コンテナーをクリアして ControlsCreated を false に設定するだけです。

于 2013-01-15T13:03:14.600 に答える