【问题标题】:How to set cell color in TableLayoutPanel dynamically?如何动态设置 TableLayoutPanel 中的单元格颜色?
【发布时间】:2015-12-03 11:12:57
【问题描述】:

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

【问题讨论】:

  • tableLayoutPanel_CellPaint 分配给您的CellPaint 事件tableLayoutPanel,然后根据某些标准进行绘制。 e.Row 是行索引,e.Column 是单元格的列索引。 e.CellBounds 是单元格的绑定。
  • 不幸的是我不擅长编程。您能否通过添加示例来澄清您的确切含义?
  • 您可以使用 CellPaint 事件,也可以简单地将面板放入单元格中并更改面板的背景颜色。请参阅下面的答案。

标签: c# .net winforms tablelayoutpanel


【解决方案1】:

选项 1 - 使用 CellPaint 事件

这里是一步一步的例子:

  1. 创建一个Form
  2. 将工具箱中的TableLayoutPanel 放在您的Form
  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;

【讨论】:

  • 好的。非常感谢。但关键是这个事件只在程序开始时引发。我必须这样做,只有在需要一遍又一遍的时候才会发起活动。
  • 我从我的程序中添加了一段代码来阐明我的意思
  • 不,当TableLayoutPanel 需要绘制时(例如在恢复窗口后,或在另一个窗体移到它上方或手动调用tableLayoutPanel1.Refresh() or .Invalidate() 后,该事件会引发
  • 作为另一个简单的选项,您可以将Panel 放在每个单元格中,并将PanelDock 属性设置为Fill,并将其Margin 属性设置为0,0,那么每次你想改变位置(column, row)的面板颜色时,你可以使用这个代码:this.tableLayoutPanel1.GetControlFromPosition(column, row).BackColor = Color.Red;
  • 没问题)对我来说不难
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多