ASP.NET动态地将UserControl添加到PlaceHolder,而不是触发Click Event,只有Page_Load

Pep*_*tal 1 c# asp.net user-controls master-pages placeholder

在我的ASP.Net页面中,我有PlaceHolder和Button.当用户单击此按钮时,我将一些UserControls从我的接口方法getControl添加到PlaceHolder.码:

    protected void ActionBtn_Click(object sender, EventArgs e)
    {
        if (provider != null)
        {
            actualObject = (PlaceHolder)provider.getControl();
            PlaceHolder1.Controls.Add(actualObject);
        }
    }
Run Code Online (Sandbox Code Playgroud)

方法getControl:

    public object getControl()
    {
        ph = new PlaceHolder();

        exportInbBtn = new Button();
        exportInbBtn.Text = "Export Inventury";
        exportInbBtn.Click += new EventHandler(myButton_ServerClick);
        ph.Controls.Add(exportInbBtn);
        exportInbBtn.ID = "exportInbBtn";

        return ph;
    }
Run Code Online (Sandbox Code Playgroud)

方法ASP页面中的Page_Load和Page_Init为空.问题是,当用户单击按钮exportInbBtn(带有文本:"Export Inventury")时,单击事件myButton_ServerClick将不会上升.只有网页刷新.我准备了一些答案,但我不知道如何轻松解决这个问题.

Rud*_*dis 5

如果您触发*myButton_ServerClick*事件,则会调用回发并且ASP.Net想要触发调用事件,但是您的控件未添加到页面中,这就是ASP.Net忽略此事件的原因.

在回发之后和要触发的事件之前,您必须再次添加控件,然后在它们之后调用事件.

更新

像这样的东西

页:

<asp:Button runat="server" ID="btnTest" Text="Add control" OnClick="btnTest_Click"/>
<asp:Label runat="server" ID="result"></asp:Label>
<asp:HiddenField runat="server" ID="controlLoaded"/>
<asp:PlaceHolder runat="server" ID="phTest"></asp:PlaceHolder>
Run Code Online (Sandbox Code Playgroud)

代码背后:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (controlLoaded.Value == "1")
        {
            AddControl();
        }
    }

    protected void btnTest_Click(object sender, EventArgs e)
    {
        AddControl();
    }

    protected void myButton_ServerClick(object sender, EventArgs e)
    {
        result.Text = "OK";
    }

    public object getControl()
    {
        var ph = new PlaceHolder();

        var exportInbBtn = new Button();
        exportInbBtn.Text = "Export Inventury";
        exportInbBtn.Click += new EventHandler(myButton_ServerClick);
        ph.Controls.Add(exportInbBtn);
        exportInbBtn.ID = "exportInbBtn";

        return ph;
    }

    private void AddControl()
    {
        var actualObject = (PlaceHolder)getControl();
        phTest.Controls.Add(actualObject);
        controlLoaded.Value = "1";
    }
Run Code Online (Sandbox Code Playgroud)