2012-02-05 40 views
1

我正在动态加载用户控件到div中,我需要在回发时保留以便在用户完成编辑后调用Save方法。该div和所有用户控件有EnableViewState = True在PostBack上保留动态用户控件

ASPX事业部申报

<div id="dynamicDiv" runat="server" enableviewstate="true"> 
</div> 

代码隐藏

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If (Not IsPostBack) Then 
     'Implement some logic to load the User Controls using LoadControl 
     'Set all the userControl properties (including EnableViewState = True) 
     'Call a method in the user control to load it's content 

     Me.dynamicDiv.Controls.add(userControl) 
    End If 
End Sub 

Protected Sub Save(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click 
    For Each t As userControlType In Me.dynamicDiv.Controls 
     t.Save() 
    Next 
End Sub 

所以......控件加载罚款,但我不能回传找到一个方法来保护者他们,我无法重新加载它们,因为用户已经将数据输入到usercontrol(这是我需要保存的)。

P.S.我尝试将它们添加到列表中,然后将该列表添加到ViewState,但我无法正确序列化控件。我实现ISerializable的用户控件的代码后面,但随后说,ASCX是MOT标有

Type 'ASP.controls_userControlType_ascx' in Assembly 'App_Web_pn5vxhpw, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

+1

如果使用'IsPostback',则还需要重新创建UserControl。 – 2012-02-05 19:16:59

+0

问题是重新创建的控件不会有任何用户的输入。 – PedroC88 2012-02-06 03:55:19

+0

如果这是真的,回发后没有ASP.NET控件可以保留值。您只需要像以前一样分配相同的ID,并最晚将它们添加到Page_Load中。如果您知道要创建的控件的数量(可以存储在ViewState中),则可以通过将计数器变量附加到控件ID来获取ID。 – 2012-02-06 08:05:52

回答

2

从评论复制:

您需要重新创建用户控件也如果IsPostback

您只需要像以前一样分配相同的ID并最迟在Page_Load中添加它们。如果您知道要创建的控件的数量(可以将其存储在ViewState中),则可以通过将计数器变量附加到控件ID来获取ID。

4

动态控件序列化需要添加德宁页面初始化没有页面加载。然后它们将被视图状态拾取。每次都需要创建它们。创建动态控件时不需要Ispostback。

+0

那么我怎样才能调用保存用户输入的用户控件上的'Save'方法? – PedroC88 2012-02-05 14:44:58

+0

每次创建时都必须将保存处理程序连接到按钮的单击事件。如果您在init事件中创建控件,则输入应保存在视图状态中。 – 2012-02-06 13:00:38