TableLayoutPanel НЕТ границы вокруг первого столбца?

У меня есть класс, который расширяет 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);

person Jan Tacci    schedule 23.08.2012    source источник


Ответы (2)


Попробуйте наоборот. Нарисуйте границы только вокруг ячеек, которые вы хотите иметь:

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;
person LarsTech    schedule 23.08.2012
comment
Это не сработает, потому что рисование границ выполняется в OnPaintBackground. - person Tergiver; 24.08.2012
comment
@JanTacci Я не могу повторить проблему с обрезанными краями. Вместо использования e.CellBounds попробуйте new Rectangle(Point.Empty, new Size(e.CellBounds.Width - 1, e.CellBounds.Height - 1)) и посмотрите, сработает ли это. - person LarsTech; 24.08.2012

Отрисовка границ ячейки выполняется TableLayoutPanel в переопределении OnPaintBackground.

Чтобы изменить способ рисования границ, вам нужно не задавать никаких границ (чтобы базовый класс ничего не рисовал), а затем рисовать все остальные границы в собственном переопределении OnPaintBackground.

TableLayoutPanel использует внутреннюю функцию ControlPaint.PaintTableCellBorder для выполнения рисования границы. Поскольку вы не можете его использовать, вам следует взглянуть на исходный код (с помощью Reflector или ILSpy), чтобы увидеть, как они это сделали.

person Tergiver    schedule 23.08.2012