我有一个用户控件,它在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
}
问题是单击保存按钮后,用户控件消失了。这是可以理解的,我没有问题再次创建和添加它 - 但我确实想访问用户输入并保存它。我怎么能这样做?
答案 0 :(得分:1)
要访问内部控件,您必须使用属性公开它们或使用FindControl
。
另外,正如您所提到的,您已在每次回发时将动态控件添加回页面。
答案 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";
}