2009-04-15 70 views
6

我想要調整Windows窗體上的UserControl(它有一個網格)。 下面的代碼是我在表單中的內容。我得到的行爲是,當我把它變大的時候,控件被調整大小。但它不縮水。我在做什麼錯(或)我錯過了什麼?不能修改表達式,因爲它不是一個變量

private void AdjustGrid() 
{ 
    ZoomControl.Location = new Point(5, 5); 
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75); 
} 

void zoomform_Resize(object sender, EventArgs e) 
{ 
    AdjustGrid(); 
} 

現在用戶控件具有以下代碼:

//Resize the grid that the UserControl has on it 
private void NameValuePropertyBag_Resize(object sender, EventArgs e) 
{ 
    grdNameValueProperties.Location = new Point(4,4); 
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8); 
} 

我試圖

grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

它使我的錯誤 「因爲它不是一個變量不能修改的表達」。 ..我錯過了什麼?

附加信息:

我使用的setparent()調用的Windows移動/縮放一個用戶控件爲另一種形式(ZoomForm)。 Anchor似乎不適用於使用SetParent()移動的控件......更確切地說,它可能正在工作,但我已經重新繪製問題。

我錨/碼頭對無需重繪問題的工作[我刪除調整大小事件wireup和調整停靠到填充]

的ZoomForm initally沒有控制。 Usercontrol被動態添加到ParentForm中。

目前,我可以使縮放表格更大 與上述代碼 但不小於。

+0

爲什麼不使用錨定屬性而不是代碼來調整大小? – recursive 2009-04-15 00:38:50

+0

@recursive:我使用SetParent()Windows調用來移動/縮放UserControl到另一個窗體(ZoomForm)。 Anchor似乎並不適用於使用SetParent()移動的控件...更確切地說,它可能正在工作,但我已經重繪問題 – 2009-04-15 00:47:36

回答

1

您不能直接改變一個用戶控件的屬性Size.Width,因爲Size屬性是值類型,所以改變其寬度將基本上覆蓋了整個Size財產。相反,在WinForms控件提供自己的寬度和高度的屬性,因此,此代碼應工作:

grdNameValueProperties.Width = this.Width - 8; 
grdNameValueProperties.Height = this.Height - 8; 

說了這麼多,我跟@遞歸的評論認爲,你應該只使用用戶控件的Anchor屬性,以使「自動「調整大小。

+0

@Matt:謝謝......我確實擺脫了新的Size()分配。我仍然有同樣的問題:我可以使窗體更大但不能更小:( – 2009-04-15 01:01:29

+0

您調整了哪些Resize事件?UserControl所在的控件上的事件?您可以捕獲窗體的Resize事件嗎? – 2009-04-15 02:35:00

7
grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

該代碼給出了錯誤,因爲Size是一個值類型,而不是引用類型。閱讀這個http://www.yoda.arachsys.com/csharp/parameters.html可能有助於解釋值類型和引用類型之間的差異。

4

作爲遞歸評論,您應該只使用Anchor屬性。

由於Size屬性公開結構而不是引用類型,因此出現錯誤。 Size屬性返回控件的大小對象的副本。寫入屬性寬度和Hight這個副本是沒有意義的,因爲它只是一個臨時副本,並不在任何地方由內存支持。

+0

@danbruc:這不是我第一次被SOOO愚蠢的。謝謝你的複習:) – 2009-04-15 01:11:02

0

對於第一部分 -

首先,我建議你使用的用戶控件的Anchor屬性,而不是試圖大小這個自己。它非常簡單,非常可靠地處理窗口大小調整。

如果你想這樣做,你應該看看鏈接this.ClientSize而不是this.Height和this.Width。你可能把你的控制權設置得太大,而且你無法使用面板或其他你正在坐的事情,這會導致各種問題。

第二部分是由於gridNameValue Properties.Size.Width是一個結構體的成員。

當您調用gridNameValueProperties.Size時,您將返回一個Size結構體,然後嘗試在返回的結構體(不是原始結構體)上設置寬度。這就是爲什麼你需要一次性設置整個Size值的類型。創建一個新的Size()並將其設置爲gridNameValueProperties.Size是進行此項工作的唯一方法。

1

目前,我可以使縮放形式更大,但上面的代碼不會更小。

一些控件對它們具有MinSize(或類似)屬性。你有沒有這樣的設置,使你無法調整更小的尺寸?

相關問題