Echilon
Echilon

Reputation: 10244

Dynamic controls in postback

I'm trying to add a set of LinkButtons to the PagerRow of a GridView in an UpdatePanel. I'm using the RowCreated event to instantiate and add these. The problem I have is the click handlers are only fired the second time.

I create the LinkButtons using

Protected Sub grd_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If (e.Row.RowType = DataControlRowType.Pager) Then
        Dim pageSizer = New GridViewPageSizer(grdItems)
        e.Row.Cells(0).Controls.AddAt(0, pageSizer)
    End If
End Sub

To create the LinkButtons themselves, I'm using

    Dim lnkSize = New LinkButton() With { _,
        .Text = size.ToString(), _
        .CommandArgument = size.ToString(), _
        .ID = "pageSizer" & size
    }
    AddHandler lnkSize.Click, AddressOf lnkPageSize_Click ' an EventHandler which just changes pagesize based on CommandArgument
    liSize.Controls.Add(lnkSize)

The GridViewPageSizer inherits HtmlGenericControl and adds an event handler for the click of each button. On every postback, the pager row is recreated, so the old buttons are replaced with a new set and their event handlers only fire on the second click. If I check for !IsPostBack, the buttons disappear after the first click. I've tried rebinding the grid after the buttons are clicked and the pagesize changes but the same thing happens. Is there a way around this?

Upvotes: 0

Views: 484

Answers (1)

Alvin
Alvin

Reputation: 995

In order for an EventHandler to trigger correctly, you need to bind it on Page Init/PreInit.

Make a session indicator and on postback, check that session on Page Init.

If that satisfies the condition, instead of recreating it on RowCreated Event, recreate the controls together with the Events on Page Init instead.

This time, events will trigger correctly.

Upvotes: 1

Related Questions