如何在c#中重写Form.Show()方法

时间:2013-01-20 14:35:56

标签: c# winforms

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

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

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

3 个答案:

答案 0 :(得分: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);
    }

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

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

答案 1 :(得分:10)

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

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

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

}

答案 2 :(得分:4)

为什么不使用激活事件?

它会帮助你。激活表单后,列表框将刷新。

我认为您无法覆盖show(),这就是为什么它无法解决您的问题。

private void Form1_Activated(object sender, System.EventArgs e)
{
  list.Items.Clear();
  loadListItems();
}