如何动态设置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事件
这是一个循序渐进的例子:
- 创建一个
Form
- 在
Form
上放置工具箱中的TableLayoutPanel
- 在设计图面上选择
tableLayoutPanel1
,然后按F4键查看属性。 - 从属性网格的工具栏中,您可以选择显示属性 或事件 。 单击事件图标,然后从列表中双击
CellPaint
事件以在代码中创建tableLayoutPanel1_CellPaint
事件处理程序。 - 您可以根据某些条件在此方法中绘制每个单元格背景。 该事件将引发绘制每个单元格背景和
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); } }
要更改Cell
的BackColor
,您可以:
private void Button1_Click(object sender, EventArgs e) { //column: 0 ,row: 1 bgColors[0, 1] = Color.Red; tableLayoutPanel1.Refresh(); }
选项2 – 在单元格中托管面板
作为另一个简单的选项,您可以将Panel
放在每个单元格中,并将Panel
的Dock
属性设置为Fill
并将其Margin
属性设置为0,0
,然后每次要更改位置(column, row)
面板的颜色你可以使用这段代码:
this.tableLayoutPanel1.GetControlFromPosition(column, row).BackColor = Color.Red;