3

我想覆盖Show()表单的方法,但是 c# 不允许我这样做。当我返回上一个窗口时,我想刷新列表框。我不想使用可观察的集合等。

 protected override void Show() {
            base.Show();
            list.Items.Clear();
            loadListItems();
        }

“Sklep.OknoProduktow.Show()”:无法覆盖继承的成员“System.Windows.Forms.Control.Show()”,因为它未标记为虚拟、抽象或覆盖

4

3 回答 3

12

您不能覆盖 Show 方法,但可以隐藏它。将此代码放在表单的类中:

public new void Show()
{
     //your code here

     //call the shadowed Show method on our form.       
     base.Show();

}
于 2013-12-19T22:05:37.297 回答
11

你需要区分事件方法。如果未将事件声明为虚拟,则无法覆盖事件。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);
    }

它使用第二个项目符号,允许事件处理程序自定义您加载的列表。

尽量不要混淆更大的问题,你做错了。该列表应在表单构造函数中初始化。

于 2013-01-20T14:56:36.340 回答
4

为什么不使用激活事件?

它会帮助你。当您的表单激活时,您的列表框将刷新。

我认为你不能覆盖show(),这就是为什么它没有解决你的问题。

private void Form1_Activated(object sender, System.EventArgs e)
{
  list.Items.Clear();
  loadListItems();
}
于 2013-01-20T14:44:09.340 回答