1

updatepanel のセットに動的な onclick イベントを持つ動的なボタンを追加することに関する問い合わせを受けました。

これまでのコードは長すぎて縛られているため、シナリオを単純化しました.3 つの更新パネルを含むテスト ページを作成しました。

実際のページに関しては、最初の updatepanel はフィルター用であり、フィルターは 2 番目の update panel を更新します。2 番目の更新パネルは、フィルターに応じてすべての結果で構成されます。これはボタンのテーブルになります。

2 番目の更新パネルでこれらのボタンのいずれかをクリックすると、ボタンの ID に応じて、最後の更新パネルで結果が生成されます。

私が直面している問題は、ボタンの作成時にボタン クリック イベントを結び付けることです。最初の更新パネルの onclick からボタンを作成すると、プレースホルダーに追加されますが、クリック イベントはまったく発生しません。

これが私のテストページのコードです。

テスト.aspx

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</ContentTemplate>

</asp:UpdatePanel>


<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="False" 
    UpdateMode="Conditional">
<ContentTemplate>

<asp:PlaceHolder id="ph2" runat="server"></asp:PlaceHolder>
</ContentTemplate>

</asp:UpdatePanel>


<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">

<ContentTemplate>
<asp:PlaceHolder id="ph3" runat="server"></asp:PlaceHolder>
</ContentTemplate>

</asp:UpdatePanel>

コードビハインド:

    public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Button up2button = new Button();
        up2button.ID = "up2button";
        ph2.Controls.Add(up2button);
        up2button.Click += new EventHandler(up2button_Click); // Not being registered?

        AsyncPostBackTrigger trigger1 = new AsyncPostBackTrigger();
        trigger1.ControlID = "up2button";
        trigger1.EventName = "Click";
        UpdatePanel2.Triggers.Add(trigger1);

        ScriptManager1.RegisterAsyncPostBackControl(up2button);

        UpdatePanel2.Update();

    }

    protected void up2button_Click(object sender, EventArgs e) { //and not being fired
        Button up3button = new Button();
        up3button.ID = "up3button";
        up3button.Click += new EventHandler(up3button_click);
        ph3.Controls.Add(up3button);


        AsyncPostBackTrigger trigger1 = new AsyncPostBackTrigger();
        trigger1.ControlID = "up3button";
        trigger1.EventName = "Click";
        UpdatePanel3.Triggers.Add(trigger1);
        UpdatePanel3.Update();
    }

    protected void up3button_click(object sender, EventArgs e) {


    }
}

お時間をいただきありがとうございます。

4

2 に答える 2

0

また、同じコントロールを複数追加する場合に備えて、各コントロールに一意の ID を付与する必要があります。

例: ID 'ButtonA' のボタンを追加 ID 'ButtonA' の別のボタンを追加

ポストバック後、ボタンはイベントを適切にトリガーしますが、アクションは適切な更新を行いません。見た目がすっきりしない作り。

代わりに、動的に追加するコントロールごとに一意の ID を生成します (そしてそれらの ID を保存します)。ポストバックで、これらのコントロールを再作成し、ID を適切に再割り当てします。そうして初めて、UI が適切に更新されます。

于 2014-08-18T18:41:35.010 に答える
0

これが簡単なサンプルです。インターネットで見つけました。

動的に作成されたコントロール (ボタンとそのボタンのクリック イベントのテキスト ボックス) を保持するためにプレースホルダーを使用しました。

そしてコード:

   protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            if (ViewState["Add"] != null)
            {
                Button add = new Button();
                add.Text = "Add";
                add.Click += new EventHandler(add_Click);
                PlaceHolder1.Controls.Add(add);
            }
            if (ViewState["textboxes"] != null)
            {
                int count = 0;
                count = (int)ViewState["textboxes"];
                for (int i = 0; i < count; i++)
                {
                    textbox  textbox_foradd = new TextBox();
                    textbox_foradd.ID = "textadd" + (i + 1).ToString();
                    PlaceHolder1.Controls.Add(textbox_foradd);
                }
            }
        }

    }

    void add_Click(object sender, EventArgs e)
    {
        int count = 1;
        if (ViewState["textboxes"] != null)
        {
            count += Convert.ToInt32(ViewState["textboxes"]);
        }
        TextBox textbox_foradd = new TextBox();
        textbox_foradd.ID = "textadd" + count.ToString();
        PlaceHolder1.Controls.Add(textbox_foradd);
        ViewState["textboxes"] = count;
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Button add = new Button();
        add.Text = "Add";
        PlaceHolder1.Controls.Add(add);
        ViewState["Add"] = 1;
    }
于 2012-06-17T21:46:18.220 に答える