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事件?如果没有,我的选择是什么?
请指教.
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.那很少见.
| 归档时间: |
|
| 查看次数: |
2839 次 |
| 最近记录: |