WinForm DataGrid Изменить цвет ячейки

#c# #.net #winforms #datagrid

#c# #.net #winforms #datagrid

Вопрос:

У меня есть объект DataGrid в проекте WinForm

 Friend WithEvents StatusTable As System.Windows.Forms.DataGrid
 

У меня также есть набор Private StatusDS As Data.DataSet данных с данными, которые загружаются в StatusTable, например

 StatusTable.DataSource = StatusDS.Tables("Channels")
 

Все просто работает нормально, но теперь мне нужно изменить цвет фона всей строки, когда столбец 3 и строка x равны «12».

мой столбец 3 представляет собой строку с именем Act

моя колонка содержит обновления, такие как

  Dim ts As New DataGridTableStyle

 Dim Act As New DataGridTextBoxColumn

 Act.MappingName = "Act"
 Act.Alignment = HorizontalAlignment.Center
 Act.HeaderText = "Action"
 
 ts.GridColumnStyles.Add(Act)

 StatusTable.TableStyles.Add(ts)
 

Я не могу найти никакого способа изменить цвет фона строки, если столбец act и строка X имеют значение «12».

например, если у меня есть эта таблица

 Act
"1"
"12"
"1"
"4"
"12"
 

Я должен изменить цвет строк № 2 и 5 (первый старт в 1)

У меня много кода, и я стараюсь изложить здесь минимум.. скажите мне, если вы пропустили какую-либо информацию

Комментарии:

1. Начиная с .NET Core 3.1, DataGrid элементы управления больше не доступны: ссылка . Если вы хотите, чтобы ваш проект жил долго, переключитесь на использование DataGridView вместо этого.

Ответ №1:

Примечание: Вопрос касается Windows Forms .NET DataGrid, который устарел и больше недоступен в .NET CORE и .NET 5. Настоятельно рекомендуется обновить ваше решение, чтобы использовать DataGridView;

В любом случае, если вы застряли с DataGrid и не можете легко перейти на DataGridView, ответ для вас.

Настройка внешнего вида DataGrid

Чтобы настроить элемент управления DataGrid, обычно необходимо определить DataGridTableStyle и добавить к нему несколько DataGridColumnStyle.

Чтобы иметь полный контроль над внешним видом строк и столбцов, вам обычно необходимо создавать пользовательские стили столбцов, используя один из существующих встроенных стилей столбцов, таких как DataGridTextBoxColumn или DataGridBoolColumn, или базовый DataGridColumnStyle. Затем вы можете настроить поведение, переопределив свойства и методы класса.

Вы найдете эту статью очень полезной:

Пример — Изменить цвет фона строки на основе значения ячейки определенного столбца

Здесь я создаю новый стиль столбца, используя встроенный DataGridTextBoxColumn и переопределяя его метод рисования. В методе я проверяю, является ли значение первого столбца нечетным числом:

 public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
{
    protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
        int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
    {
        var idCellValue = ((DataRowView)source.List[rowNum])["Id"];
        var brush = backBrush;
        if (idCellValue != DBNull.Value amp;amp; ((int)idCellValue) % 2 == 1)
            brush = Brushes.Yellow;
        base.Paint(g, bounds, source, rowNum, brush, foreBrush, alignToRight);
    }
}
 

Затем использовать его:

 private void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Rows.Add(1, "A");
    dt.Rows.Add(2, "B");
    dt.Rows.Add(3, "C");

    var dg = new DataGrid();
    dg.Dock = DockStyle.Fill;
    var ts = new DataGridTableStyle();
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
    { MappingName = "Id", HeaderText = "Id" });
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
    { MappingName = "Name", HeaderText = "Name" });
    dg.TableStyles.Add(ts);

    this.Controls.Add(dg);
    dg.DataSource = dt;
}
 

И вы увидите результат:

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

Примечание: определенно имеет смысл не помещать какую-либо бизнес-логику внутри пользовательского столбца, вместо этого вы можете вызвать событие форматирования и поместить любую логику внутри обработчика событий и передать данные форматирования обратно в столбец, используя аргументы события.