你需要区分事件和方法。如果未将事件声明为虚拟,则无法覆盖事件。Form.Shown 事件不是虚拟的,也不受保护。
在 Winforms 中还有另一种机制用于覆盖事件处理。每个事件 Xxxx 都有一个对应的名为 OnXxxx 的受保护方法。OnXxxx() 方法的职责是触发 Xxxx 事件,最终由基类中的实现来处理。在这种情况下,通过 Form.OnShown()。
这样做的价值在于,您可以在要覆盖事件的默认处理的方式上进行其他选择:
- 您可以先调用 base.OnShown(),然后执行任何您想要自定义事件的操作。这让您可以覆盖自定义事件处理程序可能所做的任何事情。在 OnPaint 事件处理程序中很常见,例如,当您想确保您绘制的任何内容都位于基类或事件处理程序绘制的任何内容之上时。
- 您可以编写自定义代码,然后调用 base.OnShown()。实现相反的目标,自定义事件处理程序可以覆盖您所做的任何事情。这是正常的方式。
- 您可以编写自定义代码而不调用 base.OnShown()。这完全阻止了事件处理程序的运行。很少这样做,但是当您的自定义如此广泛以至于客户端代码的事件处理程序可能出现故障时,您想要做出的选择。
- 您可以编写自定义代码,而不是调用 base.OnShown() 但仍会触发 Shown 事件。也很少见,但如果基本实现妨碍您,您必须这样做。
因此,您的方法最可能正确的实现是:
protected override void OnShown(EventArgs e) {
loadListItems();
//Call the original OnShown.
base.OnShown(e);
}
它使用第二个项目符号,允许事件处理程序自定义您加载的列表。
尽量不要混淆更大的问题,你做错了。该列表应在表单构造函数中初始化。