我的系统设置如下:
当我点击“Main”中的按钮时,用户控制被称为“Main”另一个用户控件(用户控件“A”,用户控件“B”,用户控件“C”)被填充在“Main”的占位符中在某些逻辑上填充A,B或C.
用户控件A,B,C上也有许多按钮。它们还有一个占位符,用于包含用户控件x,用户控件y,用户控件z,具体取决于在用户控件“A”中单击的内容。
主要加载控件(A,B或C)进入其占位符没问题,但是当我单击A,B或C中的按钮以使用x,y或z加载其占位符时,整个控件(A, B或C)消失。
我理解这与viewstate在回发期间没有持有动态控件有关。所以我所做的就是在加载到main(A,B,C)中的控件上明确地称为viewstate。当它们被加载时,我保存了一个像这个ViewState(“lastLoaded”)='A'的加载条目。当发生postabck时(即单击A中的按钮),我重新加载整个控件A.
这是发生的事情: 我单击用户控件“A”中的按钮 发生回发 由于视图状态(“lastloaded”)重新加载用户控件“A” 然后我必须再次单击“A”中的按钮,此时button_click事件将触发
有人可以帮我解决这个问题。
'这是Main.ascx
部分班级主要 继承System.Web.UI.UserControl
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
ViewState("name") = "ControlA2.ascx"
AddControl(ViewState("name").ToString())
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If ViewState("name") <> String.Empty Then
AddControl(ViewState("name").ToString())
End If
End Sub
Public Sub AddControl(ByVal name As String)
PlaceHolder1.Controls.Clear()
Dim toAdd As Control = LoadControl(name)
PlaceHolder1.Controls.Add(toAdd)
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
ViewState("name") = "ControlB.ascx"
AddControl(ViewState("name").ToString())
End Sub
结束班
'这是主要设计师
Main
asp:Button ID =“Button1”runat =“server”Text =“Add Control A” asp:Button ID =“Button2”runat =“server”Text =“Add Control B”
asp:PlaceHolder ID =“PlaceHolder1”runat =“server”&gt;
'这是ControlA2.ascx
部分班级ControlA2 继承System.Web.UI.UserControl
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
PlaceHolder1.Controls.Clear()
Dim toAdd As Control = LoadControl("ControlX.ascx")
PlaceHolder1.Controls.Add(toAdd)
End Sub
结束班
'这是ControlA2设计师
I am Control A
Add Control X
asp:Button ID="Button1" runat="server" Text="Add Control X"
asp:PlaceHolder ID =“PlaceHolder1”runat =“server” / ASP:占位符
'这是ControlB.ascx 部分类ControlA2 继承System.Web.UI.UserControl
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
PlaceHolder1.Controls.Clear()
Dim toAdd As Control = LoadControl("ControlZ.ascx")
PlaceHolder1.Controls.Add(toAdd)
End Sub
结束班
'这是ControlB设计师
I am Control B
Add Control Z
asp:Button ID =“Button1”runat =“server”Text =“Add Control Z”
asp:PlaceHolder ID =“PlaceHolder1”runat =“server”/ asp:PlaceHolder
'这是ControlX.designer
asp:Label ID="Label1" runat="server" Text="Label">I AM CONTROL X /asp:Label
'这是ControlZ设计师
asp:Label ID="Label1" runat="server" Text="Label">I AM CONTROL Z /asp:Label
答案 0 :(得分:0)
我已根据您的代码创建了一个项目,并且我已设法重新创建该问题 当我最初运行它并单击Add control A按钮时,Main控件将加载Control A并在viewstate中记下它。控件A的按钮添加控件X现在将显示ID为 Main1_ctl00_Button1 。单击此按钮时,Main的页面加载会将Control A添加回其占位符,并且将触发Control A的按钮单击事件。如果现在再次单击Main的Control A按钮,则会出现问题。 Main的页面加载方法将查看Viewstate并将控件A添加到占位符。然后Main的按钮点击事件将触发清除占位符并重新添加控件A.当显示表单时控件A的按钮添加控件X现在将具有 Main1_ctl01_Button1 的ID,因为它是第二个控件在后面的代码中生成。现在,当您单击按钮添加控件时x Main的页面加载将再次添加Control A,但因为它的id将是Main1_ctl00_Button1并且click事件来自ID为Main1_ctl01_Button1的按钮,事件将不会触发。
要解决此问题,您必须避免第二次重复创建控件。您可以通过在页面加载期间检查请求表单集合来查看按下哪个按钮,尽管这不是一个非常优雅的解决方案。您需要确保Main控件上的按钮具有唯一的文本值才能使其正常工作。 希望其他人可能能够提出更优雅的解决方案:
Dim mainButtonClick = False
For index As Integer = 0 To Request.Form.Count
If Request.Form(index) = "Button A" Or Request.Form(index) = "Button B" Then
mainButtonClick = True
End If
Next
If Not IsPostBack And Not mainButtonClick And ViewState("name") <> String.Empty Then
AddControl(ViewState("name").ToString())
End If
请原谅此代码中的任何错误,因为我不是VB.NET程序员。