如何动态设置TableLayoutPanel中的单元格颜色?

我需要编写一个函数,它将根据运行程序期间的某些条件设置TableLayoutPanel单元格中的颜色。

TableLayoutPanel除以16×16。 程序开始时有一些条件。 如果某个单元格的条件为真,则此出售必须涂成蓝色。 例如:

 private void start_Click(object sender, EventArgs e) { foreach (string str in some_list) { if (some condition) { set_color_in_cell at row[i] colum[j] //(what shoud i use here?) } } } 

我找到了这样的例子:

 private void tableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e) { if (e.Row == 0 && e.Column == 1) { e.Graphics.FillRectangle(new SolidBrush(Color.Black), e.CellBounds); } } 

但我不明白如何使用它。 如果有人知道这个,请帮助我。

 private void start_Click(object sender, EventArgs e) { string SyncAnswer = ""; foreach (string file_string in Data_from_file) { COM_Port.WriteLine(file_string); while (SyncAnswer != "READY") { SyncAnswer = COM_Port.ReadLine(); if (SyncAnswer.Substring(0, 4) == "Fire") { //raise event //paint for example a cell in Row=i Colum=j } else if (SyncAnswer.Substring(0, 4) == "Skip") { //raise event } } } } 

选项1 – 使用CellPaint事件

这是一个循序渐进的例子:

  1. 创建一个Form
  2. Form上放置工具箱中的TableLayoutPanel
  3. 在设计图面上选择tableLayoutPanel1 ,然后按F4键查看属性。
  4. 从属性网格的工具栏中,您可以选择显示属性 在此处输入图像描述 或事件 在此处输入图像描述 。 单击事件图标,然后从列表中双击CellPaint事件以在代码中创建tableLayoutPanel1_CellPaint事件处理程序。
  5. 您可以根据某些条件在此方法中绘制每个单元格背景。 该事件将引发绘制每个单元格背景和e.Row是行索引, e.Column是列索引, e.CellBounds是绘制单元格的绑定。

例如,在下面的示例中,我们绘制黑色背景if ((e.Column + e.Row) % 2 == 1)否则,我们绘制白色背景:

 private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) { if ((e.Column + e.Row) % 2 == 1) e.Graphics.FillRectangle(Brushes.Black, e.CellBounds); else e.Graphics.FillRectangle(Brushes.White, e.CellBounds); } 

在此处输入图像描述

动态更改颜色

要从另一个程序点更改颜色,例如在按钮的Click事件中,您应该将每个单元格的颜色存储在二维数组中,并使用该颜色为该单元格创建画笔:

在表单中定义bgColors

 Color[,] bgColors = new Color[2, 2] { { SystemColors.Control, SystemColors.Control }, { SystemColors.Control, SystemColors.Control } }; 

以这种方式绘制单元格的背景:

 private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) { using (var b = new SolidBrush(bgColors[e.Column, e.Row])) { e.Graphics.FillRectangle(b , e.CellBounds); } } 

要更改CellBackColor ,您可以:

 private void Button1_Click(object sender, EventArgs e) { //column: 0 ,row: 1 bgColors[0, 1] = Color.Red; tableLayoutPanel1.Refresh(); } 

选项2 – 在单元格中托管面板

作为另一个简单的选项,您可以将Panel放在每个单元格中,并将PanelDock属性设置为Fill并将其Margin属性设置为0,0 ,然后每次要更改位置(column, row)面板的颜色你可以使用这段代码:

 this.tableLayoutPanel1.GetControlFromPosition(column, row).BackColor = Color.Red;