在UpdatePanel中回发后添加用户控件,然后是另一个回发 - 如何在用户控件中获取控件的输入?

时间:2011-09-22 14:07:06

标签: c# asp.net updatepanel postback viewstate

我有一个用户控件,它在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 个答案:

答案 0 :(得分:1)

要访问内部控件,您必须使用属性公开它们或使用FindControl

另外,正如您所提到的,您已在每次回发时将动态控件添加回页面。

Dynamic Web Controls, Postbacks, and View State

答案 1 :(得分:1)

如果要添加控件programatically,请选择Page_Load(更首选)或Page_Init事件。您可以通过使用design time e“静态”添加控件(visible=fals)来解决您的问题,之后您可以启用其可见性。

如果你想要坚持使用当前的方法,你必须使用技巧

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";
}