Lenigod
Lenigod

Reputation: 153

Dynamically generated code-behind button won't fire its event

I have a series of controls (3 labels, 3 text boxes, and 2 buttons) that are created when the user clicks a button on my page. The page does its postback with the commands that will generate these controls. However, when I fill in my textboxes and click one of the newly generated buttons (btnCreate), nothing happens, and the page just reloads once again.

What I want to happen is that when the user clicks btnCreate, it fires its function, and puts the TextBox.Text into a database. But again, when btnCreate is clicked, nothing happens.

Here is the code for the generated buttons (It's the same function that generates the text boxes, which I've excluded here):

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

And for the sake of simplicity, let's just say btnCreate needs only to display the textboxes' contents.

Edit1: The call for create special notes is on page_preInit. It's call consists of the following

    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

The function getpostbackcontrol looks like this

    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

I hope this helps to clear things up as to why I'm having trouble.

Upvotes: 1

Views: 1939

Answers (1)

Mo Valipour
Mo Valipour

Reputation: 13496

What would be really useful here is to know when you're calling createSpecialNotes(). But most probably what you are missing is the life-cycle of the page.

Make sure createSpecialNotes() is called OnInit of your page. Anything after that is too late and your event handler won't be fired.

If OnLoad of your page is reached and you haven't yet bound the handler to your control, then it won't be fired.

I recommend that you read this article carefully. http://msdn.microsoft.com/en-us/library/ms178472.aspx

Upvotes: 2

Related Questions