事件发生故障Asp.Net

时间:2010-01-05 15:48:45

标签: asp.net-2.0

我的系统设置如下:

当我点击“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 

1 个答案:

答案 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程序员。