2010-02-12 89 views
4

我正在工作的應用程序將具有大量共享功能的表單。例如,每個表單都會有一個DataGridView,許多相同的按鈕,很多相同的UI代碼等等。Winform繼承和默認表單大小

我想通過創建此常見表單的基本版本來實現此目的,爲所有這些非常相似但不完全相同的子表單創建子類,並添加任何其他控件和功能我需要爲他們每個人。

我已經知道它有助於製作基本窗體的控件protected,因爲這樣可以使錨定等工作非常靈活。但是,我還沒有找到一種方法來自動生成與基本表單相同大小的派生表單。

經驗告訴我應該有一個簡單的方法來做到這一點。儘管在創建後爲每個派生表單手工輸入所需的大小並不是什麼大問題,但我寧願儘可能使所有內容儘可能乾淨,簡單和自動。

+1

我認爲* [使用Visual C#.NET繼承Windows窗體](http://www.akadia.com/services/dotnet_inherited_forms.html)*非常接近您的要求。這是真的還是不是? –

+0

@peter不好意見,但是我問了我的問題已經四年了。我現在沒有做太多的C#,但我相信你的鏈接對於發生這個問題的任何其他人都是非常有幫助的。 – dandan78

回答

3

我覺得有趣的是,你的派生形式不會自動繼承它們的基本形式的大小,因爲這應該工作,而無需你做任何事情。你的問題的

設想的原因:

我懷疑的事實,你使用Visual Studio的窗體設計器來編輯表格你的問題的結果。無論何時編輯表單,Windows窗體設計器都會在表單的InitializeComponent方法中生成所需的代碼。所有生成的代碼都是賦值表單,它們設置表單的大小,即使它與基本表單的大小相同。因此,如果希望派生表單具有與基本表單相同的大小,即使在創建派生表單後更改基本表單的大小,也可能必須手動註釋這些分配。 (不過,我不知道這是否會導致與控制定位&布點更多的問題。)

// Code to be commented out in your derived form's InitializeComponent method: 
this.AutoScaleDimensions = new System.Drawing.SizeF(...); 
this.ClientSize = new System.Drawing.Size(...); 

一旦這些行註釋掉,大小爲您的基本形式的InitializeComponent將被用來設置爲派生形式。

一種解決方案:

您可以執行以下操作,使您不必設計器生成的代碼,你編輯的形式每次都手動註釋掉:

創建來自你的基本形式的表格;我們稱之爲FrozenBaseForm。您將從該類中派生所有其他形式,而不是直接從基本形式派生。現在,在這個「中間」類,定義一個新的屬性ClientSize

public class FrozenBaseForm : BaseForm 
{ 
    new public SizeF ClientSize 
    { 
     get { return base.ClientSize; } 
     set { } 
    } 
} 

這將導致所有分配到ClientSize有完全沒有影響,因此維持從基本形式的大小。這聽起來像是說實話,但它似乎工作。您可能必須以同樣的方式隱藏Size屬性。

至於說,從FrozenBaseForm,而不是直接從BaseForm派生形式:

public class DerivedForm1 : FrozenBaseForm { ... } 
public class DerivedForm2 : FrozenBaseForm { ... } 
... 

另一種選擇(如果一切都失敗了最後一招):

作爲最後的手段,你可以簡單地忘了Forms Designer,並在代碼編輯器中手動定義派生表單(儘管我個人不希望這樣做):

public class DerivedForm : BaseForm 
{ 
    public DerivedForm() 
    { 
     // make all necessary changes to the base form: 
     ... 
    } 
} 
+0

你是對的。窗體設計器插入'this.ClientSize = new System.Drawing.Size(292,273);'行。當註釋掉表單的大小合適時。有沒有辦法阻止表單設計者這樣做? – dandan78

+0

是的,我只是擴大了我的答案。請參閱中間的「解決方法解決方案」部分。 – stakx

+0

正如您所指出的,解決方法似乎有點不標準,但看起來應該起作用。不過,我會嘗試一下,如果沒有更好的表現,你會得到複選標記。 :) – dandan78

0
public partial class derivedForm : baseForm 
{ 
    public derivedForm() 
    { 
     InitializeComponent(); 

     this.Width = base.Width; 
     this.Height = base.Height; 
    } 
} 
+1

是的,總是有這種方式,但我希望派生表單從基表自動繼承它們的大小,如果可能的話。 – dandan78

+0

這個尺寸只會是相同的初始尺寸,還是尺寸是靜態的不可調整大小的形式? –

+0

只是初始大小。現在它是默認的300x300。 – dandan78

0

爲什麼不讓BaseForm設置它自己的大小呢?

public partial class BaseForm : Form 
{ 
    public BaseForm() 
    { 
     InitializeComponent(); 

     // you could hardcode these or retrieve these values from a 
     // config file or something 
     this.Width = 640; 
     this.Height = 468; 
    } 
} 

這難道不是你想做的嗎?

+0

試過了,不行。 – dandan78