0

我有一个扩展 TableLayoutPanel 定义/构造的类,如下所示:

public class MyTableLayout : TableLayoutPanel
{
    public MyTableLayout()
    {
        this.ColumnCount = 5;
        this.RowCount = 1;
        this.CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset;
    }
}

当我的表格被绘制出来时,它的所有 5 列都有边框(正如人们所期望的那样,给定上面设置CellBorderStyle的代码)。

有没有办法可以防止在第一列周围绘制边框?

我知道你可以添加一个 CellPaint 回调:

this.CellPaint += tableLayoutPanel_CellPaint;

在此回调中,您可以执行诸如更改特定列的边框颜色之类的操作:

private void tableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (e.Column == 0 && e.Row == 0)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Red), e.CellBounds);
    }
}

但是你怎么画“否”矩形呢?

我尝试将颜色设置为 Color.Empty 但这不起作用:

e.Graphics.DrawRectangle(new Pen(Color.Empty), e.CellBounds);
4

2 回答 2

2

单元格边框的绘制由 OnPaintBackground 覆盖中的 TableLayoutPanel 执行。

要修改绘制边框的方式,您需要不设置边框(因此基类不绘制任何内容),然后在您自己的 OnPaintBackground 覆盖中绘制所有其他边框。

TableLayoutPanel 使用内部函数 ControlPaint.PaintTableCellBorder 来执行边框绘制。由于您不能使用它,您应该查看源代码(使用 Reflector 或 ILSpy)以了解他们是如何做到的。

于 2012-08-23T22:55:16.933 回答
1

换个方式试试。仅在您想要有边框的单元格周围绘制边框:

private void tableLayoutPanel_CellPaint(object sender, 
                                        TableLayoutCellPaintEventArgs e) {
  if (e.Column > 0 && e.Row == 0) {
    e.Graphics.DrawRectangle(new Pen(Color.Red), e.CellBounds);
  }
}

显然,将您的边界设置回无,以便绘画可以接管工作:

this.CellBorderStyle = TableLayoutPanelCellBorderStyle.None;
于 2012-08-23T22:46:16.570 回答