1

動的リンクボタンのイベントハンドラーでエラーを参照しました。Page_Initまたはにイベントハンドラーを追加するように指示されていますPage_Load。私は次のコードに疲れました。しかし、動的に追加されたリンクボタンをクリックしても、イベントハンドラーは起動されません。ここで何を修正する必要がありますか?

注:動的LinkBut​​tonコントロールは、一部のビジネス検証後のボタンのクリックイベントに追加されます(ビジネスコードは簡潔にするために提供されていません)

マークアップ

<form id="form1" runat="server">
<div>
    <asp:LinkButton ID="lnkTest" runat="server" OnClick="LinkButton_Click">Static LinkButton</asp:LinkButton>
    <br />
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
    <br />
    <asp:PlaceHolder ID="plhDynamicLinks" runat="server"></asp:PlaceHolder>
</div>
</form>

コードビハインド

    protected void Page_Load(object sender, EventArgs e)
    {

        foreach (Control ctrl in plhDynamicLinks.Controls)
        {
            LinkButton dynamicButton = (LinkButton)ctrl;
            dynamicButton.Click += new EventHandler(LinkButton_Click);
        }

        if (Page.IsPostBack)
        {

        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        int x = 0;

        foreach (Control ctrl in plhDynamicLinks.Controls)
        {
            LinkButton dynamicButton = (LinkButton)ctrl;
            dynamicButton.Click += new EventHandler(LinkButton_Click);
        }
    }

    protected void LinkButton_Click(object sender, EventArgs e)
    {
        LinkButton clickedControl = (LinkButton)sender;
        Response.Write(clickedControl.ID +" Link Button Clicked");
    }

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        plhDynamicLinks.Controls.Clear();

        LinkButton button1 = new LinkButton();
        button1.ID = "D1";
        button1.Text = "1";
        plhDynamicLinks.Controls.Add(button1);

        LinkButton button2 = new LinkButton();
        button2.ID = "D2";
        button2.Text = "2";
        plhDynamicLinks.Controls.Add(button2);
    }
4

3 に答える 3

2

必要なすべての動的コントロールのイベントハンドラーをPage_Load/Page_Init自体に登録する必要があります。1つの実用的な例は、ダイナミックコントロールのイベントハンドラーの動作で見ることができます

マークアップ

<form id="form1" runat="server">
<div>
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
    <br />
    <asp:PlaceHolder ID="plhDynamicLinks" runat="server"></asp:PlaceHolder>
</div>
</form>

コードビハインド

    protected void Page_Load(object sender, EventArgs e)
    {

        if (Page.IsPostBack)
        {
            LinkButton lnk1 = new LinkButton();
            lnk1.ID = "D1";
            lnk1.Text = "A";
            //Event handler must be registered in the Page_Load/Page_Init
            lnk1.Click += new EventHandler(LinkButton_Click);
            plhDynamicLinks.Controls.Add(lnk1);

            LinkButton lnk2 = new LinkButton();
            lnk2.ID = "D2";
            lnk2.Text = "B";
            lnk2.Click += new EventHandler(LinkButton_Click);
            plhDynamicLinks.Controls.Add(lnk2);

            LinkButton lnk3 = new LinkButton();
            lnk3.ID = "D3";
            lnk3.Text = "C";
            lnk3.Click += new EventHandler(LinkButton_Click);
            plhDynamicLinks.Controls.Add(lnk3);

            LinkButton lnk4 = new LinkButton();
            lnk4.ID = "D4";
            lnk4.Text = "D";
            lnk4.Click += new EventHandler(LinkButton_Click);
            plhDynamicLinks.Controls.Add(lnk4);

        }
    }

    protected void LinkButton_Click(object sender, EventArgs e)
    {
        PopulateLinksBasedOnCriteria();
        LinkButton clickedControl = (LinkButton)sender;
        Response.Write(DateTime.Now.ToString()+"___"+ clickedControl.ID + " Link Button Clicked" );
    }

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        PopulateLinksBasedOnCriteria();
    }

    private void PopulateLinksBasedOnCriteria()
    {
        plhDynamicLinks.Controls.Clear();

        if (DateTime.Now.Second < 30)
        {
            LinkButton linkButton1 = new LinkButton();
            linkButton1.ID = "D1";
            linkButton1.Text = "1";
            plhDynamicLinks.Controls.Add(linkButton1);

            LinkButton linkButton2 = new LinkButton();
            linkButton2.ID = "D2";
            linkButton2.Text = "2";
            plhDynamicLinks.Controls.Add(linkButton2);
        }
        else
        {
            LinkButton linkButton3 = new LinkButton();
            linkButton3.ID = "D3";
            linkButton3.Text = "3";
            plhDynamicLinks.Controls.Add(linkButton3);

            LinkButton linkButton4 = new LinkButton();
            linkButton4.ID = "D4";
            linkButton4.Text = "4";
            plhDynamicLinks.Controls.Add(linkButton4);
        }
    }
于 2013-01-21T12:39:33.077 に答える
1

動的コントロールはポストバックごとに再作成する必要があります。この記事は、動的コントロールとその状態を永続化する方法についての優れたリンクです。

于 2013-01-21T12:48:20.707 に答える
-1

動的コントロールにjavascriptonClick属性を追加し、コントロールイベントに必要な非表示フィールド値を設定します。Onclickダイマニックグリッドの意志postbackと意志は隠されたフィールドの値を取得します。ページの読み込みで、非表示のフィールドに値がある場合はメソッドを呼び出してジョブを実行し、ジョブの実行null後にそれを作成します。

于 2016-01-12T12:57:41.303 に答える