2009-02-03 50 views
2

我已經子類化樹視圖,並在實例化它加載一個新的ImageList(和相關的圖像)。.Net C#設計查看錯誤

每當我切換到設計器視圖時,它也試圖運行此代碼,但圖像不在設計器的路徑中,因此它崩潰。我結束了一個黑客攻擊,看看當前目錄是否是「Visual Studio」,然後什麼都不做......但是這太難看了。

我發現這發生在其他事情上。如果一個控件在加載/初始化過程中試圖使用對象,而這些對象只有在程序運行時纔可用,那麼設計視圖不能調出控件。

但是有沒有辦法解決這個問題?我猜我想要的是爲設計器(僅)設置try/catch並忽略我知道會發生的一些錯誤(如FileNotFoundException等)的能力。從System.Windows.Forms.Control繼承

感謝

回答

4

一切有DesignMode屬性,返回一個布爾值,表示如果你是在設計模式或沒有。您可以使用它來確定何時/何時不加載外部資源。

1

通常最好將這些資源的加載轉移到OnLoad,因爲它們很少直接在構建時需要。這解決了您所看到的問題,並且意味着只有至少顯示一次的樹纔會執行這些額外的資源加載步驟。

否則,您可以在設計時通過檢查DesignMode屬性並相應地採取措施排除這些步驟。

1

感謝您指出我在正確的directioon球員。

我曾嘗試註冊OnLoad事件,但是當設計視圖出現時觸發該事件,所以對我來說這並沒有什麼效果(我做錯了什麼?)。

無論如何,我多看了一下DesignMode屬性。它只能用於控件,有時你的對象可能不是控件。

因此,這裏是我喜歡的答案:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { 
    // design-time stuff 
} else { 
    // run-time stuff 
} 

發現here

1

這是一個很好的模式,如果您使用設計器中顯示的圖像樣本製作控件庫或掛鉤到其他設計器功能但是作爲開發模式我不確定它是否非常有效。

我建議將你的「業務邏輯」(在這種情況下,你的某些圖像加載到樹視圖中)在你的樹視圖控件的邊界之外。在你的情況我會放在邏輯形式的Load事件中,控制裏面:

public void Load(object sender, EventArgs e) 
{ 
    string path = "c:\somePath\toAwesome\Images"; 
    myFunkyTreeView.AddImages(path); 
} 

對於較大的應用程序,我個人認爲要在邏輯移位連出的形式本身,但是這是因爲它需要額外的管道設施作爲這種靈活性的平衡。

+0

+1:子類化WinForms控件以執行特定於業務的視圖邏輯始終以無法維護的災難結束。呸。 – 2009-02-03 22:31:48