重写的Refresh()没有为子UserControl调用

时间:2011-02-23 16:51:13

标签: c# winforms user-controls refresh

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

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的常规行为?

1 个答案:

答案 0 :(得分:1)

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

  

对继承者的说明

     

在派生中重写Refresh时   上课时,一定要打电话给基地   class的Refresh方法所以控制   及其子控件无效   并重新绘制。

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