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

时间:2015-12-03 11:12:58

标签: c# .net winforms tablelayoutpanel

我需要编写一个函数,根据运行程序时的某些条件,在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
          }
      }
   }
}

2 个答案:

答案 0 :(得分:20)

选项1 - 使用CellPaint事件

以下是一步一步的例子:

  1. 创建Form
  2. Form
  3. 的工具箱中添加TableLayoutPanel
  4. 在设计图面上选择tableLayoutPanel1,然后按 F4 键查看属性。
  5. 从属性网格的工具栏中,您可以选择显示属性 enter image description here 或事件 enter image description here 。单击事件图标,然后在列表中双击CellPaint事件以在代码中创建tableLayoutPanel1_CellPaint事件处理程序。
  6. 您可以根据某些条件在此方法中绘制每个单元格背景。该事件将引发绘制每个单元格背景,e.Row是行索引,e.Column是列索引,e.CellBounds是绘制单元格的绑定。
  7. 例如,在下面的示例中,我们绘制黑色背景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);
    }
    

    enter image description here

    动态更改颜色

    要从程序的另一个点更改颜色,例如在按钮的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);
        }
    }
    

    要更改BackColor的{​​{1}},您可以:

    Cell

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

    作为另一个简单选项,您可以在每个单元格中添加private void Button1_Click(object sender, EventArgs e) { //column: 0 ,row: 1 bgColors[0, 1] = Color.Red; tableLayoutPanel1.Refresh(); } ,并将Panel的{​​{1}}属性设置为Dock并设置其Panel属性到Fill,然后每当您想要更改位置Margin的面板颜色时,您都可以使用此代码:

    0,0

答案 1 :(得分:0)

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

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

TableLayoutPanel with PictureBox to color cell

简单,无需事件处理或状态检查。只需设置并忘记它。最坏的情况是,如果您从非 gui 线程调用,则需要调用该操作。