我很难面对ASP.NET Web窗体中动态用户控件的问题(我知道他们很糟糕,但我的项目依赖于它们)。简而言之,我的情况是:
在DropDownList SelectedIndexChanged方法后面的代码中,我使用Page.LoadControl(string virtualPath)创建用户控件的实例,然后将其添加到占位符的控件中:
selectedFilters.Controls.Add(myUserControlObject);
第一个用户控件呈现正常,但是当我尝试将新用户控件添加到占位符时,第一个用户控件将消失,并且仅呈现新的用户控件。如何保留整个用户控件对象的状态,以便在回发期间它们不会丢失?
答案 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”。