С# Изменить цвет фона ячейки таблицы в TableLayoutPanel

Я пытаюсь программно изменить цвет фона ячейки таблицы внутри TableLayoutPanel. Ячейки могут быть либо null, либо взяты пользовательским элементом управления во время выполнения (всегда меняющиеся).

Я делал это:

TableName.GetControlFromPosition(column, row).BackColor = Color.CornflowerBlue;

Конечно, это работает, только если в этой ячейке что-то есть. Как я могу также изменить свойства нулевой ячейки во время выполнения?


person o.o    schedule 03.08.2016    source источник


Ответы (2)


Обратите внимание, что на самом деле не существует такой вещи, как TableLayoutPanelCell. «Ячейки» строго виртуальны.

Вы можете использовать событие CellPaint для рисования любого BackColor в любой «ячейке», пустой или нет:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{

    if (e.Row == e.Column)
        using (SolidBrush brush = new SolidBrush(Color.AliceBlue))
            e.Graphics.FillRectangle(brush, e.CellBounds);
    else
        using (SolidBrush brush = new SolidBrush(Color.FromArgb(123, 234, 0)))
            e.Graphics.FillRectangle(brush, e.CellBounds);
}

введите здесь описание изображения

Конечно, цвета и условия на ваше усмотрение.

Обновление: еще раз обратите внимание, что вы не можете раскрасить определенную «ячейку», потому что нет TableLayoutPanelCells! Нет такого класса, ни элементов управления, ни даже объектов. Его просто не существует! TLP не состоит из "ячеек". Он состоит только из строк и столбцов.

Таким образом, чтобы покрасить «ячейку», вам нужно закодировать подходящее условие в событии CellPaint, которое ближе всего к использованию имени «ячейка» в .NET.

Вы можете использовать простые формулы или явные перечисления для создания нужного цветового макета в зависимости от ваших потребностей.

Вот два более сложных примера:

Для простого макета шахматной доски используйте это условие:

if ((e.Row + e.Column) % 2 == 0)

Для макета произвольной формы соберите все значения цвета в Dictionary<Point>, Color ;

Dictionary<Point, Color> cellcolors = new Dictionary<Point, Color>();
cellcolors.Add(new Point(0, 1), Color.CadetBlue);
cellcolors.Add(new Point(2, 4), Color.Blue);
..
..
..

и написать:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (cellcolors.Keys.Contains(new Point(e.Column, e.Row )))
        using (SolidBrush brush = new SolidBrush(cellcolors[new Point(e.Column, e.Row )]))
            e.Graphics.FillRectangle(brush, e.CellBounds);
    else
        using (SolidBrush brush = new SolidBrush(defaultColor))
            e.Graphics.FillRectangle(brush, e.CellBounds);
}
person TaW    schedule 03.08.2016
comment
Как я могу указать, какую ячейку покрасить с этим событием? TableLayoutCellPaintEvenArgs имеет только get для Row и Column, поэтому я не могу установить эти значения. У меня есть 2D-массив, представляющий таблицу, заполненную 1 и 0 (всегда меняющуюся). Я хочу покрасить ячейки, где в массиве есть 1. Прямо сейчас событие рисует всю таблицу независимо от состояния. - person o.o; 04.08.2016
comment
Это событие вызывается для каждой «ячейки» и при каждом обновлении. Таким образом, чтобы установить цвета определенных ячеек, вам нужно закодировать их индексы строк/столбцов в условиях. В зависимости от ваших потребностей это может быть как просто, как формула, так и утомительно, как перечисление каждой ячейки. Смотрите мое обновление для еще двух примеров! - Вы написали: Сейчас событие закрашивает всю таблицу независимо от условия. Это, конечно, неверно, точнее: Да, все «ячейки» всегда закрашиваются с помощью этого события, но всегда в соответствии с условием, которое вы пишете. - person TaW; 07.08.2016
comment
Большое спасибо! Все это имеет смысл сейчас. - person o.o; 07.08.2016

когда ячейка имеет значение null, вы не можете установить для нее свойство BackColor. При установке цвета вы должны проверить, является ли он нулевым. И вы можете установить цвет элементов управления в ячейках, а не BackColor ячейки. пример

person Gry    schedule 03.08.2016
comment
У вас есть предложение о том, как я должен сделать это тогда? У меня 64 ячейки. Я думал сделать 64 панели и разместить по одной в каждой ячейке. Затем поместите пользовательские элементы управления на каждую панель. Что вы думаете? - person o.o; 03.08.2016
comment
да, конечно, вы можете получить то, что вы хотите, как вы говорите. Я сделал, как вы говорите. private void Form1_Load(object sender, EventArgs e) { panel1.BackColor = Color.Green; panel2.BackColor = Color.Red; panel5.BackColor = Color.Yellow; panel7.BackColor = Color.SeaGreen; } вы можете установить BackColor любой панели. - person Gry; 04.08.2016