2016-08-03 1415 views
1

我試圖以編程方式更改TableLayoutPanel內部表格單元格的背景色。單元格可以是null,也可以是運行時用戶控件(始終更改)。C#更改TableLayoutPanel中表格單元格的背景顏色

我這樣做:

TableName.GetControlFromPosition(column, row).BackColor = Color.CornflowerBlue; 

當然,如果在該單元格的東西這僅適用。我怎樣才能在運行時更改空單元的屬性?

回答

1

請注意,確實沒有這樣的東西TableLayoutPanelCell。 '細胞'嚴格爲虛擬

可以使用CellPaint事件得出任何BackColor到任何「細胞」,爲空或不:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 

    if (e.Row == e.Column) 
     using (SolidBrush brush = new SolidBrush(Color.AliceBlue)) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
    else 
     using (SolidBrush brush = new SolidBrush(Color.FromArgb(123, 234, 0))) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
} 

enter image description here

當然顏色和條件是由你..

更新:請再次注意,您無法爲某個「單元格」着色,因爲TableLayoutPanelCells!沒有這樣的班級,既不控制也不控制對象。它只是不存在! TLP是由'細胞'組成的而不是。它僅由行和列組成。

所以要給「單元格」着色,您需要在CellPaint事件中編寫合適的條件,這是最接近於使用名稱「單元格」的.NET。

根據您的需要,您可以使用簡單的公式或顯式枚舉來創建所需的顏色佈局。

這裏有兩個更詳細的例子:

對於一個簡單的棋盤佈局使用此條件:

if ((e.Row + e.Column) % 2 == 0) 

對於自由佈局收集在一個Dictionary<Point>, Color所有顏色值;

Dictionary<Point, Color> cellcolors = new Dictionary<Point, Color>(); 
cellcolors.Add(new Point(0, 1), Color.CadetBlue); 
cellcolors.Add(new Point(2, 4), Color.Blue); 
.. 
.. 
.. 

寫:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 
    if (cellcolors.Keys.Contains(new Point(e.Column, e.Row))) 
     using (SolidBrush brush = new SolidBrush(cellcolors[new Point(e.Column, e.Row)])) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
    else 
     using (SolidBrush brush = new SolidBrush(defaultColor)) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
} 
+0

如何指定使用此事件着色哪個單元格? 'TableLayoutCellPaintEvenArgs'只有'get'用於'Row'和'Column',所以我不能設置這些值。我有一個二維數組,表示填充1和0(總是變化)的表格。我想爲單元格中存在「1」的單元格着色。現在,無論條件如何,該事件都在繪製整張桌子。 –

+1

爲每個「單元格」和每次刷新調用此事件。因此,要設置某些單元格的顏色,您需要在條件中對其行/列索引進行編碼。根據您的需要,這可以像一個公式一樣簡單,或者像列舉每個單元格一樣繁瑣。看看我的更新了兩個更多的例子! - 你寫道:_現在,事件正在繪製整張桌子,不管情況如何。這肯定是不正確的,或者說:是的,所有'單元格'總是使用這個事件來繪製,但__always根據你寫的條件___。 – TaW

+0

非常感謝!現在一切都說得通了。 –

1

當單元格爲空時,您無法設置它的BackColor屬性。設置顏色時,應檢查它是否爲空。你可以在單元格中設置控件的顏色,而不是單元格的BackColor。 example

+0

你對我應該怎麼做,然後一個建議?我有64個單元格。我正在考慮製作64塊面板,並在每個單元中放置一塊。然後將用戶控件放在每個面板中。你怎麼看? –

+1

是的,當然你可以得到你想要的,就像你說的那樣。 我照你說的做了。 \t'private void Form1_Load(object sender,EventArgs e) { panel1.BackColor = Color。綠色; panel2.BackColor = Color.Red; panel5.BackColor = Color.Yellow; panel7.BackColor = Color.SeaGreen; }' 你可以設置任何面板的BackColor。 – Gry

相關問題