【问题标题】:Overridden Refresh() not called for child UserControl未为子 UserControl 调用覆盖的 Refresh()
【发布时间】:2011-02-23 16:51:13
【问题描述】:

我遇到了一个奇怪的问题(WinXP / .NET 2.0)。我使用覆盖 Refresh() 的 WinForm UserControl:

public override void Refresh()
    {
        DoSomeStuff();
        base.Refresh();
    }

我将此 UserControl 作为子控件添加到另一个控件并希望刷新所有子控件:

ParentControl : UserControl
{
  [...]

  public ParentControl (...)
  {
    [...]

    UserControl ChildControl = ModelEngine.MainControl; // UserControl as mentioned above
    this.Controls.Add(ChildControl);

    [...]

    ModelEngine.MainControl.Refresh(); //#1
    this.Refresh(); // #2
  }
}

直接调用 Refresh() 方法 (#1) 可以正常工作。 我希望我可以在父类(#2)上调用 Refresh(),这会在所有子控件上触发递归 Refresh()(如 MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx 中所述)。但是,不会执行子控件中被覆盖的 Refresh()。 顺便说一句:将 ControlStyles.UserPaint 设置为 true 并没有改变行为。

当然,我可以直接调用 Refresh()(如 #1)或编写自己的递归 Refresh()。但我想知道这个错误是否表明我的代码中某处存在更大的问题......

那么我的代码中是否存在明显错误,或者这是 .NET 的常规行为?

【问题讨论】:

    标签: c# winforms user-controls refresh


    【解决方案1】:

    正如您链接到的页面中所说:

    继承人须知

    当在派生对象中覆盖刷新时 类,一定要调用基类 类的 Refresh 方法使控件 及其子控件无效 并重新绘制。

    您必须显式调用基本Refresh() 方法。否则,将无法运行基本方法,并且将丢失整个覆盖概念。

    【讨论】:

    • 在他的 ParentControl 类中,他似乎没有重写基本 Refresh() 方法,所以看起来他在使用“this”时正在调用基本方法。
    • @Ocelot20 确实如此,但他是在构造函数中调用虚方法。见stackoverflow.com/questions/119506/…
    • 抱歉,没有意识到这是一种虚拟方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多