如何处理触发用户控件创建的按钮事件?

时间:2012-02-03 15:06:25

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

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

同样在页面上,我有一个asp:下拉列表,其中包含可以添加到此数据库列表中的项目。随着这个下拉列表,我有一个按钮'添加'。我的意图是用户选择和项目,点击添加,然后表单上的用户控件列表将包含此新项目。

我完成了所有这些工作。

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

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

简单的重新启动:我需要知道如何通过页面按钮单击事件向页面添加动态创建的用户控件,并且仍然可以让用户控制内部点击(等)事件。

感谢您的帮助。

编辑:根据绅士们的反馈,并根据他们的建议进行进一步的研究,我最终根据本页面上的内容实施了一个解决方案:

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

这是一个片段,显示我是如何处理这个问题的。此代码段位于我的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

2 个答案:

答案 0 :(得分:1)

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

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

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

ASP.NET Page Life Cycle Overview

答案 1 :(得分:1)

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

您需要设计自己的状态跟踪机制,以确定在PreInit期间需要添加UserControl。我通常使用ViewState,由this seemingly similar post证明。