Добавление пользовательского элемента управления после обратной передачи в UpdatePanel с последующей другой обратной передачей - как получить ввод элементов управления в пользовательском элементе управления? - PullRequest
2 голосов
/ 22 сентября 2011

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

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

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

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <div><asp:Button ID="ButtonAdd" runat="server" Text="Add User Control" OnClick="ButtonAdd_OnClick" /></div>
        <div id="divContent" runat="server"></div>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate>
        <div><asp:Button ID="ButtonSave" runat="server" Text="Save" OnClick="ButtonSave_OnClick" /></div>
    </ContentTemplate>
</asp:UpdatePanel>

И

protected void ButtonAdd_OnClick(object sender, EventArgs e)
{
    MyUserControl uc = Page.LoadControl("MyUserControl.ascx") as MyUserControl;
    divContent.Controls.Add(uc);
}

protected void ButtonSave_OnClick(object sender, EventArgs e)
{
    // Hopefully, get controls from within the user control's grid and save their input
}

Проблема в том, что после нажатия кнопки сохранения пользовательский элемент управления исчезает. Это понятно, и у меня нет проблем с его созданием и добавлением снова - но я хочу получить доступ к пользовательскому вводу и сохранить его. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Если вы хотите добавить элементы управления programatically, выберите Page_Load (более предпочтительно) или событие Page_Init.Вы можете решить свою проблему, добавив элемент управления «статически» (design time) с помощью visible=fals e и позже вы можете включить его видимость.

Если вы хотите придерживаться текущего подхода, как в вашем посте,придется использовать трюк .

MyUserControl uc;

protected void Page_Load()
{
   if(ViewState["isAdd"]!=null)
    {
       AddControl();
    }
}

void AddControl()
{
    uc = Page.LoadControl("MyUserControl.ascx") as MyUserControl;
    divContent.Controls.Add(uc);
}

protected void ButtonAdd_OnClick(object sender, EventArgs e)
{
    if(ViewState["isAdd"]==null)
        AddControl();
    ViewState["isAdd"]="yes";
}
1 голос
/ 22 сентября 2011

Чтобы получить доступ к внутренним элементам управления, вы должны предоставить им свойства или использовать FindControl.

Также, как вы упомянули, вы добавляете динамические элементы управления обратно на страницу при каждой обратной передаче.

Динамические веб-элементы управления, обратные передачи и состояние просмотра

...