2010-11-04 73 views
0

我有一个用户控件已被动态添加到页面。当我点击用户控制按钮:用户控件按钮单击事件未提升

  1. 的button_click事件没有被提出
  2. 用户控件从页面

这里移除页面职位的按钮在我的用户控件上点击事件:

Protected Sub btnAddAttribute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddAttribute.Click 
     Try 
      Dim attrName As String = txtAddAttributeName.Text 
      Dim attrValue As String = txtAddAttributeValue.Text 

      'ADD ATTRIBUTE TO ATTRIBUTE TABLE 
      putSQLData("INSERT INTO OD_Attribute_Values (AttributeName, AttributeValue) VALUES('" & attrValue & "', '" & attrName & "'") 

      'ADD ATTRIBUTE TO PRODUCT DATA FOR THIS PRODUCT 
      putSQLData("UPDATE OD_Product_Data SET VariantMapping = VariantMapping + ' | " & attrName & ":" & attrValue & "' WHERE SKU = '" & SelectedSKU & "'") 

      'ADD NEW ctrlAttribute TO PARENT PLACEHOLDER AND SET VALUES 
      Dim newAttr As New AttributeControl 
      newAttr.AttributeName = attrName 
      newAttr.AttributeValue = attrValue 
      Page.Controls.AddAt(Page.FindControl("phAttributes").ClientID, newAttr) 

      'REMOVE THIS CONTROL FROM PARENT PLACEHOLDER 
      Me.Dispose() 

     Catch ex As Exception 
      Common.SendError(ex.Message, "AttributeControl.btnAddAttribute_Click") 
     End Try 
End Sub 

这里是动态添加控件:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
     'WEB TAB 
     getAttributes() 
End Sub 

    Protected Sub getAttributes() 
     Try 
      Dim attr As String = "" 
      Dim attrName As String = "" 
      Dim attrValue As String = "" 

      Dim ds As DataSet = getSQLData("SELECT VariantMapping FROM OD_Product_Data WHERE SKU='" & selectedSKU & "'") 
      For Each dr As DataRow In ds.Tables(0).Rows() 
       attr = dr(0).ToString 
      Next 
      ds = Nothing 
      Dim attrArr As Array = attr.Split("|") 
      For Each item As String In attrArr 
       Dim attrDetail As Array = item.Split(":") 
       attrName = attrDetail(0) 
       attrValue = attrDetail(1) 
       Dim ctrlAttributes As AttributeControl = LoadControl("ctrlAttribute.ascx") 
       ctrlAttributes.AttributeName = attrName 
       ctrlAttributes.AttributeValue = attrValue 
       ctrlAttributes.ID = "ctrlAttribute-" & attrName 
       phAttributes.Controls.Add(ctrlAttributes) 
      Next 
     Catch ex As Exception 
      SendError(ex.Message, "Default.getAttributes") 
     End Try 
End Sub 

Protected Sub btnAddAttribute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddAttribute.Click 
     Dim ctrlAttributes As AttributeControl = LoadControl("ctrlAttribute.ascx") 
     ctrlAttributes.ID = "ctrlAttribute" & phAttributes.Controls.Count + 1 
     phAttributes.Controls.Add(ctrlAttributes) 
End Sub 

Protected Sub btnCreateAttribute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCreateAttribute.Click 
     Dim ctrlAddAttribute As AddAttributeControl = LoadControl("ctrlAddAttribute.ascx") 
     ctrlAddAttribute.SelectedSKU = selectedSKU 
     ctrlAddAttribute.ID = "ctrlAddAttribute" & phAttributes.Controls.Count + 1 
     phAttributes.Controls.Add(ctrlAddAttribute) 
End Sub 
+0

发布你的代码会有帮助,这好像是事件处理程序没有正确设置或PostBack导致意外的行为 – kd7 2010-11-04 18:29:02

+0

出于好奇,你为什么在代码注释中尖叫? – 2010-11-04 18:40:44

+0

您是否确定您的控件在页面重新加载后仍然存在。就像Random说的那样,看到控件被调用的代码会更有帮助。 – Lareau 2010-11-04 18:45:41

回答

2

当添加控件动态的页面,您必须一定要控制添加到页面上的每一个访问。在第一次访问时添加动态控件是一个常见的错误,但在回发上添加而不是 - 这是行不通的!您需要在每次访问时将动态控件添加到控件层次结构中。

这里有一对夫妇的资源我动态创建控件工作之前推荐阅读:

快乐编程!

+0

谢谢!我读了你链接的信息。 但是,我没有找到答案。 下面是发生了什么事情,也许你可以指向正确的方向。 1.页面加载 2.用户单击页面上的一个按钮,将页面上的用户控件添加到页面 上的占位符3。然后,用户单击该用户控件上的按钮。 回发时,触发回发的用户控件将丢失,并且该特定事件的事件处理程序(在用户控件上)不会被触发。 如何告诉页面重新添加出生在#2中的控件并在该控件上提高按钮单击事件? – s15199d 2010-11-04 20:58:34

+0

@ s15199d:您将不得不记住,添加了哪些控件。你可以在页面上保存一些标志状态,这可能是最好的。我没有为你准备好干的答案,因为我从来没有以这种方式处理过动态控件。我以前在这个领域的所有经验都是根据数据库中的配置动态加载控件。 – 2010-11-04 22:19:44

+0

谢谢斯科特,我遵循你的建议,并且主要为我工作。每次我动态地添加一个控件时,我将它的control.ID添加到ViewState变量,然后在Page_Load上解析该viewstate变量并重新添加我的动态添加控件。似乎主要是工作。我还有其他几个元素可以解决这个问题... – s15199d 2010-11-08 16:46:48