2011-02-23 43 views
0

我碰到一個奇怪的問題(操作系統/ .NET 2.0)。我用它覆蓋刷新(一個WinForm用戶控件):重寫刷新()不要求孩子用戶控件

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

我添加此用戶控件作爲子到另一個控件,並希望刷新所有子控件:

ParentControl : UserControl 
{ 
    [...] 

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

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

    [...] 

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

直接調用刷新()方法( #1)正常工作。 我希望我可以在父類調用刷新()(#2),這將觸發一個遞歸刷新()上的所有子控件(如MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx解釋)。但是,子控件中重寫的Refresh()不會被執行。 順便說一下:將ControlStyles.UserPaint設置爲true並不會改變行爲。

當然,我可以直接調用刷新()(如#1)或寫我自己的遞歸刷新()。但我想知道這個錯誤是什麼地方在我的代碼一個更大的問題的指示......

那麼,有一個明顯的錯誤在我的代碼或這是.NET的常規行爲?

回答

1

因爲它在頁面上顯示給您鏈接:

給繼承

當重寫在派生 類刷新,一定要調用基 類的刷新方法,以便控制 及其子控件無效 並重新繪製。

您必須明確調用基地Refresh()方法。否則,將沒有辦法而不是運行基本方法,並且覆蓋的整個概念將會丟失。

+0

在他ParentControl課上,他似乎並沒有覆蓋基刷新()方法,所以它看起來像他*是*使用「this」的時候調用基方法。 – Ocelot20 2011-02-23 17:03:38

+0

他確實,他發佈的第一位代碼! – jimplode 2011-02-23 17:04:41

+0

@ Ocelot20這是真的,但他正在構造函數中調用一個虛擬方法。看到http://stackoverflow.com/questions/119506/virtual-member-call-in-a-constructor – Jay 2011-02-23 19:47:42