【问题标题】:How to override Form.Show() method in c#如何在 C# 中覆盖 Form.Show() 方法
【发布时间】:2016-10-29 21:24:47
【问题描述】:

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

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

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

【问题讨论】:

  • 你为什么不把代码放到Shown事件处理方法中?
  • @HansPassant Show 是一个方法而不是一个事件
  • @TLama 我找不到 OnShow 只是 OnShown?
  • 对不起,我的 (Delphi) 不好。如果您想在首次显示表单时加载这些项目,我的意思是使用 Shown 事件。
  • 您是否将另一个窗口显示为主窗体中的模式窗口?

标签: c# winforms


【解决方案1】:

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

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

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

}

【讨论】:

  • 一个新的话题要为我学习,谢谢!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    为什么不使用激活事件?

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

    我认为您不能覆盖show(),这就是它没有解决您的问题的原因。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多