#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;
}
И вы увидите результат:
Примечание: определенно имеет смысл не помещать какую-либо бизнес-логику внутри пользовательского столбца, вместо этого вы можете вызвать событие форматирования и поместить любую логику внутри обработчика событий и передать данные форматирования обратно в столбец, используя аргументы события.