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

C# 如何在c中重写Form.Show()方法#,c#,winforms,C#,Winforms,我想重写表单的Show()方法,但c#不允许我这样做。我想在返回上一个窗口时刷新列表框。我不想使用可观察的集合等 protected override void Show() { base.Show(); list.Items.Clear(); loadListItems(); } “Sklep.OknoProduktow.Show()”:无法重写继承的成员 'System.Windows.Forms.C

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

 protected override void Show() {
            base.Show();
            list.Items.Clear();
            loadListItems();
        }
“Sklep.OknoProduktow.Show()”:无法重写继承的成员 'System.Windows.Forms.Control.Show()',因为它未标记 虚拟的、抽象的或重写的


为什么不从激活的事件中使用

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

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

private void Form1_Activated(object sender, System.EventArgs e)
{
  list.Items.Clear();
  loadListItems();
}
您需要区分事件和方法。如果事件未声明为虚拟,则无法重写该事件。所显示的Form.Showed事件不是虚拟事件,也不受保护

在Winforms中还有另一种覆盖事件处理的机制。每个事件Xxxx都有一个名为OnXxxx的相应受保护方法。OnXxxx()方法的职责是触发Xxxx事件,最终由基类中的实现负责。在本例中,使用Form.OnShown()

这样做的价值在于,您可以选择其他方式来覆盖事件的默认处理:

  • 您可以先调用base.OnShown(),然后执行任何自定义事件的操作。这让您可以覆盖自定义事件处理程序可能执行的任何操作。在OnPaint事件处理程序中常见,例如,当您希望确保绘制的内容位于基类或事件处理程序绘制的内容之上时
  • 您可以编写自定义代码,然后调用base.OnShown()。实现了相反的目标,自定义事件处理程序可以覆盖您所做的任何操作。这是正常的方式
  • 您可以编写自定义代码,而不是调用base.OnShown()。这会阻止事件处理程序运行。很少这样做,但是当您的自定义非常广泛,以致于客户端代码的事件处理程序可能会出现故障时,您要进行的选择
  • 您可以编写自定义代码,而不是调用base.OnShown(),但仍会触发显示的事件。也很少见,但如果基本实现遇到阻碍,您必须这样做
因此,您的方法最可能的正确实现是:

    protected override void OnShown(EventArgs e) {
        loadListItems();
        //Call the original OnShown.
        base.OnShown(e);
    }
它使用第二个项目符号,允许事件处理程序自定义您加载的列表


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

不能重写Show方法,但可以对其进行阴影处理。将此代码放入表单的类中:

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

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

}

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