c# - 在 Winform 中引发一次 UserControl Load 事件

标签 c# winforms events user-controls load

我有一个带有面板的 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/

相关文章:

c# - 文本对象 Unity 上的 onclick 事件

c# - 关闭 SQLiteConnection (SQLiteConnectionWithLock)

.net - WinForms 中的图层效果(模糊等)

powershell - 如何在 Windows 事件日志中存储对象?

actionscript-3 - as3 - 从父 swf 到子 swf 的 dispatchEvent

c# - asp.net 身份中的软删除

c# - 右键单击 DataGridView 的列标题时,如何正确定位上下文菜单?

c# - C# 中的 ArgumentOutOfRange 异常

c# - Datagridview 添加工具提示

javascript - 设置页面上现有的工具提示和稍后加载的工具提示