2013-02-14 64 views
2

我有一個TableLayoutPanel目前有多行+列。它由一個for循環填充,每次依賴於SQL查詢的輸出運行時都會有所不同。在運行時期間通過變量更改TableLayoutPanel的單元顏色?

void tblTableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
    { 
     if (e.Row == 2 || e.Row == 4) 
     { 
      Graphics g = e.Graphics; 
      Rectangle r = e.CellBounds; 
      g.FillRectangle(Brushes.Red, r); 
     } 
    } 

這是我得對目前色獨立行的代碼,但我希望能夠上色取決於兩個變量(J和K)單個細胞。

   TableLayoutPanel.Controls.Add(label, J, K); 

同樣這裏是我怎樣添加了一個標籤,使用J和K在TableLayoutPanel中的細胞是否有可能過載CellPaint方法,以允許J和K在它被使用的樣本?或者如果是的話,我怎麼能在運行時重新着色單元格?

我以前問過這個問題,並得到以下解決方案;

CellPaint是一個事件而不是方法。我建議你創建一個方法GetColor(int row,int column),它返回一個顏色Brush,然後在CellPaint事件中用e.Row和e.Column調用你的方法。

我不完全確定這是如何工作的,因爲我使用的變量在主程序中,那麼我不需要將這些變量與我的方法中的變量進行比較嗎?或者將它們設置在某處進行比較,然後再進行比較。任何人都可以爲我解釋這個更清楚嗎?或者給我一個例子?謝謝。

回答

2

下面是一個例子:

void tableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    Rectangle r = e.CellBounds; 
    g.FillRectangle(GetBrushFor(e.Row, e.Column), r); 
} 

private Brush GetBrushFor(int row, int column) 
{ 
    if (row == 2 && column == 1) 
     return Brushes.Red; 

    // other logic 
    // ... 
    // return default Brush 
} 

備註 - 它看起來奇怪,要基於公正行和列的索引指定的顏色,而不是一些業務邏輯(即根據在單元格中顯示的數據) 。

+0

但如果我想讓行和列等於2個變量的值,我在form_load中有這種可能嗎? – 2013-02-14 14:41:46

+0

@DanBarker使你的窗體類的變量字段,然後都將可用在GetBrushFor方法 – 2013-02-14 14:44:40

+0

嗯當然是啊..我不知道爲什麼我沒有意識到...謝謝! – 2013-02-14 14:46:38

0

一個可能的解決方案是將j和k保存在Control.Tag中,例如作爲對象的數組,並在單元格分頁期間將j和k從控件中取回到本單元格中。