+1  A: 

The reason this works:

protected void Page_Load(object sender, EventArgs e)
{
    RecordSelector1.DropDownSelectedIndexChanged 
        += new EventHandler(RecordSelector1_DropDownSelectedIndexChanged);
}

and this does not:

<cc1:RecordSelector ID="RecordSelector1" runat="server"
OnDropDownSelectedIndexChanged="RecordSelector1_DropDownSelectedIndexChanged" />

is because the first one adds the handler after the control has been initialized (via the page's Init). The second example gets parsed much earlier and as such the page is attempting to add the handler before the control has initialized.

Due to the nature of the page's life cycle I think you may have to live with adding the event handler in the code-behind. There will be no way to add the handler before the control is initialized because that control will always be null prior to initialization.

Andrew Hare
Is there a way to do it that doesn't have this pitfall? A "Scott Gu"-recommended approach to exposing child controls' events in a user control?
Yadyn
I wish I could recommend a different approach but I think that exposing the event via the user control is your best option as any consumer of the event should be responsible to wire it up in a way that works for them.
Andrew Hare