Search code examples
c#asp.netsharepointweb-parts

ASP.NET - Add Event Handler to LinkButton inside of Repeater in a RenderContent call


I've got a Sharepoint WebPart which loads a custom User Control. The user control contains a Repeater which in turn contains several LinkButtons.

In the RenderContent call in the Webpart I've got some code to add event handlers:

        ArrayList nextPages = new ArrayList();
        //populate nextPages ....
        AfterPageRepeater.DataSource = nextPages;
        AfterPageRepeater.DataBind();

        foreach (Control oRepeaterControl in AfterPageRepeater.Controls)
        {
            if (oRepeaterControl is RepeaterItem)
            {
                if (oRepeaterControl.HasControls())
                {
                    foreach (Control oControl in oRepeaterControl.Controls)
                    {
                        if (oControl is LinkButton)
                        {
                            ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click);
                        }
                    }
                }
            }
        }

The function PageNavigateButton_Click is never called however. I can see it being added as an event handler in the debugger however.

Any ideas? I'm stumped how to do this.


Solution

  • By the time RenderContent() is called, all the registered event handlers have been called by the framework. You need to add the event handlers in an earlier method, like OnLoad():

    protected override void OnLoad(EventArge e)
     { base.OnLoad(e);
       EnsureChildControls();
    
       var linkButtons = from c in AfterPageRepeater.Controls
                                                    .OfType<RepeaterItem>()
                         where c.HasControls()
                         select c into ris
                            from lb in ris.OfType<LinkButton>()
                            select lb;
    
       foreach(var linkButton in linkButtons)
        { linkButton.Click += PageNavigateButton_Click
        }                          
     }