pnlContent.Controls.Clear();
You have to be very careful with this method, it doesn't do what you think it does. It does not dispose the controls on the panel, it merely removes them. The controls go to live on, their windows are hosted to the hidden "parking window". Ready to be moved back to another parent.
In many cases that does not happen and the control will leak forever. In your specific case it isn't quite that bad yet, you still have a reference to the control. Your uc1
variable stores it. The consequence however is that its Load event doesn't fire again, that only happens once.
So if you really need that Load event to fire then you should do this the proper way, actually dispose the controls on the panel:
while (pnlContent.Controls.Count > 0) pnlContents.Controls[0].Dispose();
And then you have to create a new instance of whatever usercontrol type uc1
references. You'll then get the Load event to fire when you add it to the panel.
Another strong hidden message in this answer is that it is very likely that you shouldn't be using the Load event at all. In the vast majority of cases, code in the Load event handler belongs in the constructor. You only need Load if you need to know the Handle property or need to be sure that layout was calculated so that the final size of the control is known. That's rare.