2009-08-13 73 views
1

我沒有意識到當時我創建這個特定的應用程序,我需要重用一些組件 - 一些Windows窗體和一個或兩個類。使現有的Windows窗體可繼承

既然我已經在一個項目中創建了相當複雜的表單,那麼將這些表單轉換爲可在其他項目中重用的可繼承形式的最簡單方法是什麼?一旦完成,我想修改現有項目以使用新創建的可繼承表單。

我該如何儘可能地減輕痛苦?我在Visual Studio 2008中使用C#。

回答

2

你不需要做任何特別的事情來實現這一點。你的表單已經可以繼承。任何新的形式,只要確保第一行看起來像這樣的:

public partial class frmMyChild : frmMyInheritableForm 

代替:

public partial class frmMyChild : Form 

,讓你需要從孩子訪問任何方法或者「公共」或「保護」。

更新:另一個技巧是將原始表單上每個控件的Modifiers屬性設置爲Protected(而不是默認的Private)。在您的子窗體繼承自此窗體的設計器中,您將看到父窗體上的所有控件,並且您可以移動它們並根據需要調整它們的大小(這不會影響原始窗體的佈局)。

要訪問子窗體的任何父類的方法,您只要致電:

base.MyMethod(); 
+0

這很好。我如何重寫父窗體上的方法? – Dave 2009-08-14 18:22:44

+0

在同名的子方法上使用「new」關鍵字。例如:如果你的父母有一個名爲「DoSomething()」的void方法,你在子表單中聲明一個方法「public new void DoSomething()」(這叫做「隱藏」而不是「覆蓋」)。你仍然可以在子DoSomething()方法內調用base.DoSomething()方法,以防你想做其他的事情,然後調用基方法。 – MusiGenesis 2009-08-14 18:46:09

+0

@Musi:你爲什麼要主張隱藏(可以說是「邪惡」的做法),而不是宣稱這些方法是虛擬的? – 2009-08-15 00:08:41

1

只需聲明一個從System.Windows.Forms.Form繼承的空類,然後讓您的「巨大」類繼承它。一旦運行起來,就可以開始移動,從「巨大」類到父類一次一個小型可重用部分。

+0

我想我在這裏看到你說的話,但不是很清楚。 – MusiGenesis 2009-08-13 21:06:32

1

在你的第一個項目,添加一個新的「Windows窗體控件庫」,以您的解決方案

拖動窗口/從原始項目到新項目的類。

修復錯誤。

在這一點上,你現在有一個類庫,你可以包含在你的第二個Windows項目。

+0

@Stephen - 我已經創建了一個新的Windows窗體控件庫「到我現有的項目中,並將其拖到(移動)到一個表單中。現在如何從現有項目中訪問它? – Dave 2009-08-14 10:14:44

+0

將新項目的引用添加到然後在那裏聲明它爲「myFormClass myForm = new myFormClass();」您現在將使用「myClassLibrary.myFormClass myForm = new myFormClass();」 – 2009-08-14 12:56:15

1

請記住,您不需要將表單設計爲可繼承,以便在其他項目中使用它們。可繼承的形式是一種PITA,除了最簡單的情況之外,其他的都是麻煩的。

如果你只是想要設計你的表格,以便更多地使用便攜式,那麼最重要的事情就是確保你不在表單之外暴露內部字段(包含在控件中)。如果外部代碼(無論是在同一個項目還是另一個項目中)需要以某種視覺或行爲方式與表單進行交互,則需要公開代表該功能的函數和屬性,而不是控件本身。

除了特定形式的設計之外,如果將這些常用表單移動到單獨的控件庫中,可能會有所幫助(如果這是一個耗時的練習)。雖然你一定可以添加你的。exe文件作爲另一個項目的參考,這並不理想(也不完全直觀)。

+0

在您的可繼承形式體驗中PITA就像什麼?我用過它們很多,從來沒有遇到任何問題 – MusiGenesis 2009-08-13 21:09:00

+0

它們可能已經變得更好了,但是我在VS 2002/2003中使用了它們,確實很痛苦,重畫是不可預測的,表單控件會簡單地消失,我認爲在VS的後續版本中,事情會變得更好,有一點可以幫助確保你總是有一個無參數的構造函數,所以設計者可以調用它。不打算調用它(只會調用帶參數的構造函數),使無參數的變量保持私有,但不要刪除它,否則設計人員會給你帶來麻煩。 – 2009-08-14 23:58:54