【问题标题】:User Control Button Click Event Not Raised未引发用户控制按钮单击事件
【发布时间】:2010-11-04 18:26:14
【问题描述】:

我有一个已动态添加到页面的用户控件。当我单击该用户控件上的按钮时:

  1. 没有引发 button_click 事件
  2. 页面回发
  3. 用户控件已从页面中删除

这是我的用户控件上的按钮单击事件:

 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

【问题讨论】:

  • 发布您的代码会有所帮助,这似乎是事件处理程序未正确设置或 PostBack 导致意外行为
  • 出于好奇,你为什么在代码 cmets 中尖叫?
  • 您是否确保您的控件在页面重新加载后仍然存在。就像 Random 所说,查看调用控件的代码会更有帮助。
  • B/c 我在编码时会使用 2 种类型的 cmets。 1 是小写。我在部署之前摆脱的那些。部署后我在代码中保留的全部大写,以供将来参考。
  • 您应该至少发布将控件动态添加到页面的代码。你在哪里从页面中删除控件? Me.Dispose 将对象标记为垃圾收集器的一次性对象,但不会将其从命名容器的控制集合中删除。

标签: asp.net vb.net


【解决方案1】:

在向页面动态添加控件时,您必须确保在每次访问时都将控件添加到页面。在第一次访问时添加动态控件但在回发时添加动态控件是一个常见错误 - 这将不起作用!您需要在每次访问时将动态控件添加到控件层次结构中。

在使用动态创建的控件之前,我建议您阅读以下几个资源:

编程愉快!

【讨论】:

  • 谢谢!我阅读了您链接的信息。但是,我没有找到答案。这就是发生的事情,也许你可以指出我正确的方向。 1. 页面加载 2. 用户单击页面上的按钮,将用户控件添加到页面上的占位符 3. 用户然后单击该用户控件上的按钮 当回发发生时,触发回发的用户控件是丢失,并且不会触发该特定事件的事件处理程序(在用户控件上)。如何告诉页面重新添加在 #2 中诞生的控件并在该控件上引发按钮单击事件?
  • @s15199d:您必须以某种方式记住添加了哪些控件。您可以在页面上以视图状态存储一些标志,这可能是最好的。我没有一个简单的答案给你,因为我从来没有以这种方式使用过动态控件。我过去在这方面的所有经验都是根据某处数据库中的配置动态加载控件。
  • 感谢 Scott,我听从了您的建议,并且大部分时间都对我有用。每次动态添加控件时,我都会将它的 control.ID 添加到 ViewState 变量中,然后在 Page_Load 上解析该 viewstate 变量并重新添加动态添加的控件。似乎大部分时间都在工作。我还有一些其他元素需要解决...
  • 是的,很抱歉没有早点回复您。我要说的是,您需要以某种方式跟踪您添加的控件 - 视图状态(可能是最好的)、会话、数据库、页面上的表单字段......一些东西。多年来,我在 ASP.NET 应用程序中使用动态控件做了大量工作,但老实说,从来没有像您描述的那样。通常是我知道根据一些已经设置的配置(通常在数据库中)加载哪些控件。
【解决方案2】:

在这里找到了巧妙的解决方法:http://www.justskins.com/forums/placeholder-child-of-child-49926.html

【讨论】:

  • 我个人不会走这条路,但对于其他想要在这个领域交易的人来说,这是一个有趣的策略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多