#c# #datagridview #row #match
#c# #datagridview #строка #совпадение
Вопрос:
У меня есть представление сетки данных, и мне интересно, можно ли выделить только определенные строки, содержащие определенное значение столбца.
Поэтому я бы хотел, чтобы все строки по умолчанию были черными с белым текстом, за исключением любой строки, в которой указанный столбец равен FUJI/UNIVERSAL
. Для этой строки я бы хотел, чтобы она была желтой с черным текстом.
Итак, мой вопрос … возможно ли это? и если да, то как?
Ответ №1:
Лучшим местом является событие RowPrePaint DataGridView.
Вот как вы можете этого добиться.
void dataGridView1_RowPrePaint(object sender,
DataGridViewRowPrePaintEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Cells[0].Value == "YourConditionalValue")
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
}
}
Ответ №2:
Например, путем обработки OnCellFormatting
события.
Вот фактический фрагмент кода из моего старого хобби-проекта WinForms, который делает именно это. Это также снова учит меня тому, насколько важно комментировать (нет шансов, что я все еще помню это сейчас).
Я уверен, что вы можете адаптировать его к своим целям.
private void sheetCalendar_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (CurrentRota == null)
{
return;
}
/* A word of explanation is needed. We retrieve the DataGridView from sender
* and we access the cell in question directly.
* MSDN advices against it -
* "to avoid performance penalties When handling this event,
* access the cell through the parameters of the event handler
* rather than accessing the cell directly."
*
* The problem is that we don't want to set the same colour to the same cell
* over and over again.
* And e.CellStyle always "forgets" what colour the call had had! */
var dgrid = sender as DataGridView;
var _col = e.ColumnIndex;
var _row = e.RowIndex;
var _highlight = (((Rota) sheetCalendar.Rows[e.RowIndex].DataBoundItem).Monday ==
CurrentRota.Monday);
var color = _highlight ?
Settings.Default.DGRIDCalendar_CurrentlyEditedBackColor :
SystemColors.Window;
if (dgrid[_col, _row].Style.BackColor != color)
dgrid[_col, _row].Style.BackColor = color;
}
Ответ №3:
Обработайте событие OnPaint для элемента DataGridView
управления.
Выполните синтаксический анализ строк и задайте цвет для строк, содержащих искомую информацию.
Некоторый пример кода:
int specificColumnIndex = 5;
const string FUJIUNIV = "FUJI/UNIVERSAL";
const Color cFUJIBACK = Color.Yellow;
const Color cFUJITEXT = Color.Black;
public Form1() {
InitializeComponent();
dataGridView1.Paint = new PaintEventHandler(DataGridView_Paint);
}
private void DataGridView_Paint(object sender, PaintEventArgs e) {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (row.Cells[specificColumnIndex].Value.ToString() == FUJIUNIV) {
foreach (DataGridViewCell cell in row.Cells) {
cell.Style.BackColor = cFUJIBACK;
cell.Style.ForeColor = cFUJITEXT;
cell.Style.SelectionBackColor = Color.Gold;
}
}
}
}
}