C# 未为子UserControl调用重写的刷新()
我遇到了一个奇怪的问题(WinXP/.NET2.0)。我使用覆盖Refresh()的WinForm UserControl: 我将此UserControl作为子控件添加到另一个控件,并希望刷新所有子控件:C# 未为子UserControl调用重写的刷新(),c#,winforms,user-controls,refresh,C#,Winforms,User Controls,Refresh,我遇到了一个奇怪的问题(WinXP/.NET2.0)。我使用覆盖Refresh()的WinForm UserControl: 我将此UserControl作为子控件添加到另一个控件,并希望刷新所有子控件: ParentControl : UserControl { [...] public ParentControl (...) { [...] UserControl ChildControl = ModelEngine.MainControl; // UserC
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中所述)。但是,不会执行子控件中被重写的Refresh()。
顺便说一句:将ControlStyles.UserPaint设置为true不会改变行为
当然,我可以直接调用Refresh()(如#1)或编写自己的递归Refresh()。但我想知道这个bug是否是我代码中某个更大问题的迹象
那么,我的代码中是否存在明显的错误,或者这是.NET的常规行为 正如您链接到的页面中所述: 继承人须知 在派生数据库中重写刷新时 类,请确保调用基 类的刷新方法,以便 其子控件将无效 并重新绘制
必须显式调用base
Refresh()
方法。否则,将无法不运行基方法,覆盖的整个概念将丢失。在他的ParentControl类中,他似乎没有覆盖基Refresh()方法,因此看起来他在使用“this”时调用了基方法。@Ocelot20这是真的,但他在构造函数中调用了一个虚拟方法。看我的道歉,我不知道这是一个虚拟的方法。
ParentControl : UserControl
{
[...]
public ParentControl (...)
{
[...]
UserControl ChildControl = ModelEngine.MainControl; // UserControl as mentioned above
this.Controls.Add(ChildControl);
[...]
ModelEngine.MainControl.Refresh(); //#1
this.Refresh(); // #2
}
}