【问题标题】:How can I handle a button event that triggers user control creation?如何处理触发用户控件创建的按钮事件?
【发布时间】:2012-02-03 15:06:25
【问题描述】:

我有一个 ASP.NET Web 表单,我通过用户控件在其上显示数据库项目列表,动态生成用户控件 - 工作正常。

另外,在页面上,我有一个 asp:dropdownlist,其中包含可以添加到此数据库列表中的项目。除了这个下拉菜单,我还有一个“添加”按钮。我的意图是用户选择项目,点击添加,然后表单上的用户控件列表将包含这个新项目。

我已经完成了所有这些工作。

我的问题是用户控件有一个“删除”按钮,它会从列表中删除选定的项目。这行得通,除非我添加一个新项目。因为我的“添加”按钮事件总是在 Page_Load 之后触发,所以即使我重新生成用户控件列表,内部用户控件点击事件也不会触发,因为控件不是作为 Page_Load 的一部分创建的。

我需要知道我做错了什么,或者这里的最佳做法,任何建议。我试图准确描述问题,但如果我没有成功,请告诉我,我可以添加更多细节。

简单的恢复:我需要知道如何通过页面按钮单击事件将动态创建的用户控件添加到页面,并且仍然让用户控件内部单击(等)事件触发。

感谢您的帮助。

编辑:根据这里先生们的反馈,并针对他们的建议进行了一些进一步的研究,我最终根据此页面上的内容实施了一个解决方案:

http://ryanfarley.com/blog/archive/2005/03/11/1886.aspx

这是一个显示我如何处理这个问题的 sn-p。这个 sn-p 驻留在我的 PreInit 事件处理程序中。不完全是文明时代的优雅武器,但有时你只需要使用爆能枪。

'Look to see if button for adding a new client number has been
'clicked.  If so, call the sub to add the item NOW, so that it
'is able to have it's internal click events fire.
For Each control_string As String In Request.Form
  Dim ctl As Control = Page.FindControl(control_string)

  If (ctl IsNot Nothing) AndAlso (ctl.ID = "cmdAddClientNumber") Then
    Me.AddClientNumberToList()
    Exit For
  End If
Next

【问题讨论】:

  • 这没有多大意义...为什么您希望添加的控件在首次添加时“触发其内部点击事件”?这样的正常流程是: 第一步:用户点击“cmdAddClientNumber”;第 2 步:在 cmdAddClientNumber_Click 中,您 AddClientNumberToList;第三步:用户点击“ClientNumber”中的某个按钮;第 4 步:在 PreInit 中,调用 AddClientNumberToList;第 5 步:ASP.NET 负责调用“ClientNumber.SomeButton_Click”以响应用户操作。如果您需要更多细节 - 您将展示更多代码。
  • 在所有应有的尊重下都非常有意义,并解决了我的问题。我通过按钮单击事件创建用户控件。该控件有自己的删除按钮,允许用户将其从列表中删除。如果一个项目被意外添加,用户需要能够单击该用户控件上的删除按钮来删除它。我的问题解决了。如果这还不够清楚,将我的所有代码转储到此页面将无济于事。非常感谢。

标签: asp.net user-controls event-handling


【解决方案1】:

在按钮处理程序上,您最初将 UserControl 添加到页面。 OnPreInit(接下来将在用户单击 UserControl 上的 Delete 时触发),您应该重新添加 UserControl - 以便它存在,并且可以处理 Delete 按钮事件。

您需要设计自己的状态跟踪机制来确定您需要在 PreInit 期间添加 UserControl。我一般使用 ViewState,this seemingly similar post 证明了这一点。

【讨论】:

  • 马克,谢谢先生——我想你和瑞克已经证实了我对此的担忧。需要明确的是,我重新创建了我的动态控件,并且内部点击事件工作得很好,除了通过按钮点击事件添加一个。走这条路时,我想知道用户控件是否值得付出努力,而不是仅仅使用老式的 request.item 并自己跟踪事物。我试图留在 .NET 事件领域。猜猜那是行不通的……这会加重病情。
  • 显示动态控件的事件连接,这是可能的。
【解决方案2】:

类似的问题: How to create and use custom control with UpdatePanel added to the page programmatically

应将动态控件重新添加到控件树OnPreInit,请参阅文档:

PreInit - 创建或重新创建动态控件。

ASP.NET Page Life Cycle Overview

【讨论】:

  • 好的,我当然可以这样做,但这如何解决我在这里描述的问题?
  • 按原样添加,只是重新创建必须提前进行,因此在下一次回发中,您的新控件会及时添加,以便 ASP.NET 将其连接起来并触发您正在寻找的事件。动态控件和事件可能非常令人困惑。
  • 我将在 PreInit 中添加它们的创建 - 感谢您的建议。但是,我认为这并不能解决我所描述的问题。我的问题是,如果我单击“添加”按钮,该事件会在所有 Init/Load 事件之后触发。我可以在那时重新生成动态控件,以便用户可以看到列表中的新项目,但内部用户控件单击事件不会触发。这是我的问题 - 希望这是有道理的。
  • 你能展示你如何连接动态控件点击事件的代码吗?
  • 瑞克,我不确定你想看到什么。你有什么怀疑吗?我猜如果可以捕获用户控件单击事件的唯一方法是在 Init/Load 中添加控件,那么我将不得不按照 Mark 的建议执行操作并自己进行跟踪,而不是使用 .NET事件。我猜就是这样。
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多