我遇到了一个奇怪的问题(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的常规行为?
答案 0 :(得分:1)
正如您在链接的页面中所说:
对继承者的说明
在派生中重写Refresh时 上课时,一定要打电话给基地 class的Refresh方法所以控制 及其子控件无效 并重新绘制。
您必须明确调用基本Refresh()
方法。否则,将无法不运行基本方法,并且覆盖的整个概念将丢失。