2

我有一个 TableLayoutPanel 目前有多行 + 列。它由一个 for 循环填充,每次运行时都会有所不同,具体取决于 SQL 查询的输出。

void tblTableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
    {
        if (e.Row == 2 || e.Row == 4)
        {
            Graphics g = e.Graphics;
            Rectangle r = e.CellBounds;
            g.FillRectangle(Brushes.Red, r);
        }
    }

这是我目前为单个行着色的代码,但我希望能够根据 2 个变量(J 和 K)为单个单元格着色。

                TableLayoutPanel.Controls.Add(label, J, K);

同样,这里是我如何使用 J 和 K 向 TableLayoutPanel 中的单元格添加标签的示例。是否可以重载 CellPaint 方法以允许在其中使用 J 和 K?或者如果是这样,我怎么能在运行时重新着色单元格?

我之前问过这个问题并得到了以下解决方案;

CellPaint 是一个事件而不是方法。我建议您创建一个返回颜色画笔的 GetColor(int row,int column) 方法,然后在 CellPaint 事件中使用 e.Row 和 e.Column 调用您的方法。

我不完全确定这将如何工作,因为我正在使用的变量在主程序中,然后我不需要将这些与我的方法中的变量进行比较吗?或将它们设置在某个地方进行比较,然后再进行事件。任何人都可以为我解释清楚一点吗?或者给我一个例子?谢谢。

4

2 回答 2

2

这是一个例子:

void tableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    Graphics g = e.Graphics;
    Rectangle r = e.CellBounds;
    g.FillRectangle(GetBrushFor(e.Row, e.Column), r);
}

private Brush GetBrushFor(int row, int column)
{
    if (row == 2 && column == 1)
        return Brushes.Red;

    // other logic
    // ...
    // return default Brush
}

备注 - 您只想根据行和列索引而不是某些业务逻辑(即取决于单元格中显示的数据)分配颜色,这看起来很奇怪。

于 2013-02-14T14:37:43.773 回答
0

一种可能的解决方案是将 j 和 k 保存在Control.Tag中,例如作为对象数组,并在单元格绘制期间从控件中获取 j 和 k 在此单元格中的内容。

于 2013-02-14T14:43:30.773 回答