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

How to set cell color in TableLayoutPanel dynamically?

我需要编写一个函数,根据 运行 程序期间的某些条件设置 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?)
       }
    }
}

我找到了这样的例子:

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. 将工具箱中的 TableLayoutPanel 放在 Form
  3. Select tableLayoutPanel1 在设计界面上并按 F4 键查看属性。
  4. 从 属性 网格的工具栏,您可以 select 显示属性 or Events . Click on events icon and from the list, double click on 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;

另一种非常简单的方法是动态添加多个 PictureBox 控件(例如:下面的 pbCellColor)到您的 TableLayoutPanel 中的单元格,或一些其他更简单的简单控件,停靠它,将边距设置为 零,然后随时:

pbCellColor.Dock = DockStyle.None;
pbCellColor.Margin = new Size(0, 0, 0, 0);
pbCellColor.Backcolor = Color.Red;    

简单,没有事件处理或状态检查。只需设置它并忘记它。最坏的情况是,如果您从非图形用户界面线程调用,您将需要调用操作。