我有一个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是一个事件,而不是一个方法。我建议你创建一个返回颜色Brush的方法GetColor(int row,int column),然后在CellPaint事件中使用e.Row和e.Column调用你的方法。
我不完全确定这会如何工作,因为我使用的变量是在主程序中,那么我不需要将它们与我方法中的变量进行比较吗?或者将它们设置在某个地方进行比较,之后再进行比较。谁能解释一下这对我来说更清楚一点?或者也许举个例子?感谢。
答案 0 :(得分: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
}
备注 - 您希望仅根据行和列索引分配颜色,而不是某些业务逻辑(即取决于单元格中显示的数据),这看起来很奇怪。
答案 1 :(得分:0)
一种可能的解决方案是将j和k保存在Control.Tag中,例如作为对象数组,并且在单元格选择期间从控件中获取j和k从此单元格中返回。