动态生成的代码隐藏按钮不会触发其事件

时间:2012-07-19 16:54:36

标签: asp.net vb.net

我有一系列控件(3个标签,3个文本框和2个按钮),这些控件是在用户单击页面上的按钮时创建的。该页面使用将生成这些控件的命令进行回发。但是,当我填写我的文本框并单击其中一个新生成的按钮(btnCreate)时,没有任何反应,页面只会再次重新加载。

我想要发生的是,当用户点击btnCreate时,它会触发其功能,并将TextBox.Text放入数据库。但同样,当点击btnCreate时,没有任何反应。

以下是生成按钮的代码(它与生成文本框的功能相同,我在此处排除):

Protected Sub createSpecialNotes()
    Dim btnCreate As Button = New Button
    Dim btnClear As Button = New Button

    'Place properties

    lblSubject.Text = "subject"
    lblSubject.ID = "lblSubject"
    lblSubject.Width = 700
    lblAgenda.Text = "Agenda Note"
    lblAgenda.ID = "lblAgenda"
    lblAgenda.Width = 700
    lblMinutes.Text = "Minutes Note"
    lblMinutes.ID = "lblMinutes"
    lblMinutes.Width = 700

    btnCreate.Text = "Create"
    btnCreate.ID = "btnCreate"
    btnClear.Text = "Clear"
    btnClear.ID = "btnClear"

    'Add handlers for buttons
    AddHandler btnCreate.Click, AddressOf btnCreate_Click
    AddHandler btnClear.Click, AddressOf btnClear_Click

    plhCreateSpecialNotes.Controls.Add(btnCreate)
    plhCreateSpecialNotes.Controls.Add(btnClear)
End Sub

为了简单起见,我们只是说btnCreate只需要显示文本框的内容。

编辑1:创建特殊注释的请求在page_preInit上。它的呼叫包括以下

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
    'Find the control that was fired
    Dim controlFired As Control = GetPostBackControl(Me.Page)

    If (controlFired IsNot Nothing) Then
        If (controlFired.ClientID.ToString() = "btnCreateSpecial") Then
            Call createSpecialNotes()
        End If
        If (controlFired.ClientID.ToString() = "btnCreate") Then
            'i've tried putting things here to no avail.
        End If
    End If

End Sub

getpostbackcontrol函数看起来像这样

    Public Shared Function GetPostBackControl(ByVal thePage As Page) As Control
    Dim myControl As Control = Nothing
    Dim ctrlName As String = thePage.Request.Params.Get("__EVENTTARGET")
    If ((ctrlName IsNot Nothing) And (ctrlName <> String.Empty)) Then
        myControl = thePage.FindControl(ctrlName)
    Else
        For Each Item As String In thePage.Request.Form
            Dim c As Control = thePage.FindControl(Item)
            If (TypeOf (c) Is System.Web.UI.WebControls.Button) Then
                myControl = c
            End If
        Next

    End If
    Return myControl
End Function

我希望这有助于澄清我遇到麻烦的原因。

1 个答案:

答案 0 :(得分:2)

这里真正有用的是知道你何时打电话给createSpecialNotes()。但很可能你缺少的是页面的生命周期。

确保createSpecialNotes()被称为您网页的OnInit。之后的任何事情都太晚了,你的事件处理程序也不会被解雇。

如果您的页面已OnLoad,并且您还没有将处理程序绑定到您的控件,那么它将不会被触发。

我建议您仔细阅读本文。 http://msdn.microsoft.com/en-us/library/ms178472.aspx