Every time I refresh the browser, my button's event handler fires again. How do you prevent this?
One way could be to use an HTTPModule. You can generate a client side GUID, using Javascript, and have that posted back to your server. Then, if the user refreshes, you compare that GUID and see if it already exists on your server. If it does exist, then it's a refresh and you shouldn't perform your button event handler's method. An example of this implementation is described in this blog post.
Another idea could be to redirect the page (or redirect it to itself) after the user has pressed the button. This would give a clean postback and refreshing it shouldn't submit the event again.
I always try to use the PRG (Post-Redirect-Get) pattern, even though it seems a little bit unnatural to the Web Forms system.
This basically means after getting a Button_Click event, you do a redirect, perhaps using QueryString parameters to indicate to the resulting page what to display.
If you are not doing partial page updates with UpdatePanels, you don't 'lose' much doing it that way, anyway. (and if you are using partials, refreshing the page wouldn't necessarily repost anyway!)