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

Ser*_*gey 5 .net c# tablelayoutpanel winforms

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

TableLayoutPanel除以16x16.程序开始时有一些条件.如果细胞的条件为真,则此销售必须涂成蓝色.例如:

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?)
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我找到了这样的例子:

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

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

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
          }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 25

选项1 - 使用CellPaint事件

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

  1. 创建一个 Form
  2. 把一个TableLayoutPanel工具箱放在你的工具箱上Form
  3. tableLayoutPanel1在设计图面上选择,然后F4按键查看属性.
  4. 从属性网格的工具栏中,您可以选择显示"属性" enter image description here或"事件" enter image description here.单击事件图标,然后从列表中双击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);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

动态更改颜色

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

bgColors在表单中定义:

Color[,] bgColors = new Color[2, 2] {
    { SystemColors.Control, SystemColors.Control }, 
    { SystemColors.Control, SystemColors.Control } 
};
Run Code Online (Sandbox Code Playgroud)

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

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

要改变BackColorCell,您可以:

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

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

作为另一个简单的选项,您可以放入Panel每个单元格,并设置to 的Dock属性并将其属性设置为,然后每次要更改位置的面板颜色时,您可以使用此代码:PanelFillMargin0,0(column, row)

this.tableLayoutPanel1.GetControlFromPosition(column, row).BackColor = Color.Red;
Run Code Online (Sandbox Code Playgroud)