UserControl Load事件在Winform中引发一次

Edd*_*die 2 c# events user-controls load winforms

我有一个带有面板的Winform,它根据用户输入加载不同的用户控件.

// to load a user control
pnlContent.Controls.Add(uc1);

// to change to different user control
pnlContent.Controls.Clear();
pnlContent.Controls.Add(uc2);
Run Code Online (Sandbox Code Playgroud)

我注意到当我清除pnlContent并重新添加uc1时,uc1的Load事件不会被触发,即uc1的Load事件仅在uc1第一次被添加到pnlContent时被触发.

有没有办法在每次将用户控件添加到面板时始终触发Load事件?如果没有,我的选择是什么?

请指教.

Han*_*ant 6

  pnlContent.Controls.Clear();
Run Code Online (Sandbox Code Playgroud)

你必须非常小心这种方法,它不会做你认为它做的.它并没有配置在面板上的控制,它只是删除它们.控件继续存在,他们的窗口被托管到隐藏的"停车窗口".准备搬回另一位家长.

在许多情况下,这种情况不会发生,控制将永远泄漏.在你的具体情况下它还不是很糟糕,你仍然可以参考控件.你的uc1变量存储它.然而结果是它的Load事件不会再次触发,只发生一次.

因此,如果您确实需要启动Load事件,那么您应该以正确的方式执行此操作,实际上将控件放在面板上:

 while (pnlContent.Controls.Count > 0) pnlContents.Controls[0].Dispose();
Run Code Online (Sandbox Code Playgroud)

然后,您必须创建任何usercontrol类型引用的实例uc1.然后,当您将Load事件添加到面板时,将触发Load事件.

这个答案中另一个强有力的隐藏信息是你可能根本不应该使用Load事件.在绝大多数情况下,Load事件处理程序中的代码属于构造函数.如果您需要知道Handle属性,或者需要确保计算布局以便知道控件的最终大小,则只需要Load.那很少见.