动态用户控件保留回发状态

时间:2015-06-19 07:30:33

标签: c# asp.net webforms

我很难面对ASP.NET Web窗体中动态用户控件的问题(我知道他们很糟糕,但我的项目依赖于它们)。简而言之,我的情况是:

  1. 我的aspx页面中有一个DropDownList,有几个选项可供选择 from(对于每一个,我有不同的用户控件来渲染);
  2. 当我选择一个时,下面在UpdatePanel内的占位符中呈现此选项的用户控件:
  3. enter image description here

    1. 在DropDownList SelectedIndexChanged方法后面的代码中,我使用Page.LoadControl(string virtualPath)创建用户控件的实例,然后将其添加到占位符的控件中:

      selectedFilters.Controls.Add(myUserControlObject);
    2. 第一个用户控件呈现正常,但是当我尝试将新用户控件添加到占位符时,第一个用户控件将消失,并且仅呈现新的用户控件。如何保留整个用户控件对象的状态,以便在回发期间它们不会丢失?

1 个答案:

答案 0 :(得分:0)

您需要在每次回发时添加每个动态添加的控件,这通常最好在Page_PreLoad事件中完成,这样动态添加的控件将根据ViewState和发布的值返回到它的最后状态。

您可以使用ViewState存储已添加的控件。你如何做到这一点取决于你的情况,但它可能是这样的,你动态添加一个控件时会这样做:

if ((bool)ViewState["DynamicControl1"])
{
    //Add your control again here,
    //possibly duplicated from your DropDownList SelectedIndexChanged handler
}

然后在你的Page_PreLoad事件......

Imports System.IO

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Debug.WriteLine(GetSubFolder("c:\temp\test\", 1089))
End Sub

Private Function GetSubFolder(ByVal baseDirectory As String, ByVal searchTerm As String) As String
    Try
        If Not Directory.Exists(baseDirectory) Then Return Nothing

        For Each dirInfo As DirectoryInfo In New DirectoryInfo(baseDirectory).GetDirectories()
            For Each dirInfoSub As DirectoryInfo In dirInfo.GetDirectories()
                If dirInfoSub.Name.Length >= 4 AndAlso _
                    dirInfoSub.Name.Substring(dirInfoSub.Name.Length - 4) = searchTerm _
                    Then Return dirInfoSub.FullName
            Next
        Next

    Catch ex As Exception
        Debug.WriteLine(ex.Message)
    End Try
    Return Nothing
End Function

End Class

根据您的ViewState设置,只要在页面生命周期的右侧部分添加控件,ASP.NET就会自动重新填充DropDownList项目列表和选定值。如果您已禁用ViewState,则需要在Page_PreLoad事件中添加控件时重新填充列表项。

请注意,动态添加的控件每个回发都具有相同的ID非常重要,因此如果您遇到问题,请尝试将ClientIDMode设置为“AutoID”。