2010-05-04 60 views
15

我有一個tablelayoutpanel。 2x2 - 2列2行。以編程方式更改行/列跨度(tablelayoutpanel)

例如,我在一行第二列中添加了一個按鈕button1button1將dock屬性設置爲Fill。 VS Designer允許設置列/行範圍屬性button1

我想可用性改變按鈕1編程行跨度屬性,因此它可以填充全部第二列(1行和第二行)和可用性設置回。

怎麼樣?

回答

25

這段代碼如何?

private void button1_Click(object sender, EventArgs e) 
{ 
    var control = sender as Control; 

    if(control == null) 
     return; 

    if (1 == tableLayoutPanel1.GetRowSpan(control)) 
    { 
     tableLayoutPanel1.SetRowSpan(control, 2); 
    } 
    else 
    { 
     tableLayoutPanel1.SetRowSpan(control, 1); 
    } 
} 
+1

偉大的代碼。 Visual Studio設計師誤導我。我正在尋找button1屬性,試圖將button1投射到toolstippanel物品等等......謝謝! – 2010-05-04 07:05:09

+0

如果您查看了Form.Designer.cs而不是可視化設計器,則可以直接找到解決方案。 ;-) – Oliver 2010-05-04 07:09:34

+1

我知道這是一箇舊帖子,但我想指出,您不需要在C#中執行「yoda條件」,因爲如果聲明是強類型的。 (我相信,如果你確實在布爾運算符上犯了一個錯誤,而不是進行比較,那麼它會生成一個編譯器警告,而不是其它類型產生的錯誤。) – MiffTheFox 2013-03-07 17:46:13

2

儘管我發現當前最多的答案相當充分,但它也顯得比需要稍微雜亂。在設置屬性之前,您必須將控件添加到tableLayoutPanel。

Visual Studio(2013和其他可能的版本)將顯示這些屬性作爲控件的一部分。實際上,它們是tableLayoutPanel的一部分。

說明:

tableLayoutPanel.Controls.Add(**control**, x, y) 
tableLayoutPanel.SetColumnSpan(**control**, '# of cols to span') 

實施例:

tableLayoutPanel1.Controls.Add(**button1**, 0, 0); 
tableLayoutPanel1.SetColumnSpan(**button1**, 2); 
tableLayoutPanel1.SetRowSpan(**button1**, 3); 

結果:其中 '佔據' 這個空間A按鈕。 (只要它是大到足以覆蓋該區域。即使沒有「蓋」的空間,它仍然會「儲備」吧。)

O O X X X 
O O X X X 
O O X X X 
X X X X X 
X X X X X 

設置跨度比將網格的大小。 。: 不改變網格大小。 不裁剪/編輯網格大小的數字。 在編譯時不會拋出錯誤。

它將按照跨度被設置爲當前網格(tableLayoutPanel)的最大尺寸的方式動作/執行。這隻有在TLP /網格大小改變時纔有意義。

如果以編程方式將兩個控件兩個相同的網格位置相加,網格中的第一個控件將保持其位置。任何隨後添加的控件都會被推送到下一個單元塊。如果添加了「跨度」,則會將該單元塊視爲已使用並繼續搜索未使用的單元塊。

例:label1的LABEL2LABEL3加入到0,0。

  • label1的將出現在0,0
  • LABEL2:0,1
  • LABEL3:0,2

出2:標籤1具有一排跨度爲2.

  • LABEL1:0,0
  • LABEL2:搬遷到0,2
  • LABEL3:0,3

你選擇了正確的網格點和跨度之後,你可以再進一步使用dock和anchor屬性優化您的佈局。