我有一个带有面板的 Winform,它根据用户输入加载不同的用户控件。
// to load a user control
pnlContent.Controls.Add(uc1);
// to change to different user control
pnlContent.Controls.Clear();
pnlContent.Controls.Add(uc2);
我注意到,当我清除 pnlContent 并重新添加 uc1 时,uc1 的 Load 事件不会被触发,即 uc1 的 Load 事件只会在 uc1 第一次添加到 pnlContent 时被触发。
有没有办法在每次将用户控件添加到面板时始终触发 Load 事件?如果没有,我有什么选择?
请指教。
最佳答案
pnlContent.Controls.Clear();
您必须非常小心使用此方法,它不会按照您的想法行事。它不处理面板上的控件,它只是删除它们。控件继续运行,它们的窗口托管在隐藏的“ parking 窗口”中。准备好搬回另一位家长身边。
在许多情况下,这种情况不会发生,控制将永远泄漏。在您的具体情况下,还没有那么糟糕,您仍然可以引用该控件。您的 uc1
变量存储它。然而,结果是它的 Load 事件不会再次触发,只会发生一次。
因此,如果您真的需要触发 Load 事件,那么您应该以正确的方式执行此操作,实际上是在面板上放置控件:
while (pnlContent.Controls.Count > 0) pnlContents.Controls[0].Dispose();
然后您必须创建任何用户控件类型uc1
引用的新 实例。然后,当您将它添加到面板时,您将触发 Load 事件。
此答案中隐藏的另一个强烈信息是,非常您很可能根本不应该使用 Load 事件。在绝大多数情况下,Load 事件处理程序中的代码属于构造函数。只有在需要了解 Handle 属性或需要确保布局已计算以便知道控件的最终大小时,才需要 Load。这很少见。
关于c# - 在 Winform 中引发一次 UserControl Load 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17324129/