The modal popup extender is an awesome, versatile tool, but it's a little tricky getting it to work where you have one Modal Popup Extender whose contents get dynamically changed based on the clicking of multiple buttons (the update button within multiple gridview rows, for example). For one reason or another, the Ajax Control Toolkit team decided to make the TargetControlID of the extender required. That's fine when you have one button launching the popup. But if you have multiple buttons, how does the extender know what to set the TargetControlID to? The answer is that it doesn't. What you need to do is create a hidden button that you can set for the TargetControlID.
<asp:Button ID="dummybutton" runat="Server" style="display:none" />
So then just set TargetControlID="dummybutton". Now, in your click event for your button in your gridview, or calendar, or whatever,
you can just invoke the show event of the popup extender in order to display the popup.