Проблема с динамической загрузкой пользовательского элемента управления при нажатии кнопки - PullRequest
1 голос
/ 05 апреля 2010

У меня есть страница, на которой я динамически загружаю пользовательский элемент управления следующим образом:

Default.aspx:

    <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </cc1:ToolkitScriptManager>

    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

Default.aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        var ctrl = LoadControl("~/UserCtrl1.ascx");
        ctrl.ID = "ucUserCtrl1";
        PlaceHolder1.Controls.Add(ctrl);
    }

Ниже приведен код для UserCtrl1.ascx

<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Click" />
<br />
<asp:PlaceHolder ID="PlaceHolder2" runat="server"></asp:PlaceHolder>

Я динамически загружаю другой пользовательский элемент управления при нажатии кнопки 1

UserCtrl1.ascx.cs

    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "UserControl - 1 button clicked!";

        var ctrl = LoadControl("~/UserCtrl2.ascx");
        ctrl.ID = "ucUserCtrl2";
        PlaceHolder2.Controls.Add(ctrl);
    }

Ниже приведена разметка для UserCtrl2.ascx

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Label ID="Label2" runat="server"></asp:Label>
        <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

UserCtrl2.ascx.cs

    protected void Button2_Click(object sender, EventArgs e)
    {
        Label2.Text = "UserControl - 2 button clicked!";
    }

После загрузки страницы, когда я нажимаю кнопку Button1 в UserCtrl1, происходит событие щелчка, и я вижу текст Label1. Он также правильно загружает UserCtrl2, но когда я щелкаю Button2 в UserCtrl2, событие click исчезает, и еще хуже, когда я нажимаю Button2 дважды, элемент управления UserCtrl2 исчезает со страницы. Как я могу это исправить?

1 Ответ

3 голосов
/ 05 апреля 2010

Проблема со вторым элементом управления заключается в том, что вы кодируете его только после нажатия кнопки 1. Но когда происходит какой-либо другой постбэк (не нажатие кнопки 1), ваш второй элемент управления не загружается.

Одним из возможных исправлений является сохранение некоторого флага (например, в ViewState), который поможет вам определить, должен ли быть загружен ваш второй элемент управления (и загружен при загрузке страницы).

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "UserControl - 1 button clicked!";

    var ctrl = LoadControl("~/UserCtrl2.ascx");
    ctrl.ID = "ucUserCtrl2";
    PlaceHolder2.Controls.Add(ctrl);

    this.SecondControlLoaded = true; // This flag saves to ViewState that your control was loaded.
}

protected void Page_Load(object sender, EventArgs e)
{
    var ctrl = LoadControl("~/UserCtrl1.ascx");
    ctrl.ID = "ucUserCtrl1";
    PlaceHolder1.Controls.Add(ctrl);

    if (this.SecondControlLoaded)
    {
        var ctrl = LoadControl("~/UserCtrl2.ascx");
        ctrl.ID = "ucUserCtrl2";
        PlaceHolder2.Controls.Add(ctrl);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...