Я тоже искал способ сделать это. Перейдя к очевидному событию CellPainting, я обнаружил, что использование объекта Graphics объекта не помогло. Однако мне удалось использовать объект Graphics из метода DataGridView.GetGraphics (), чтобы выделить часть текста.
Я предполагаю, что вы уже знаете, как найти ячейку, содержащую строку, которую вы ищете.
внутри события CellPainting первое, что вы хотите сделать, это нарисовать ячейку как любую другую ячейку:
e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
Следующее, что нужно сделать, это разделить текст ячейки на 2 части - часть перед текстом поиска и сам текст поиска. это нужно для вычисления прямоугольника, в котором вы хотите выделить.
Затем используйте метод MeasureString объекта Graphics, чтобы получить местоположение искомого текста в ячейке. Поскольку я использую объект Graphics, относящийся к самой сетке, а не объект Graphics для события, мне пришлось вычислить расположение выделенного прямоугольника в сетке. Я использовал метод DataGridView.GetCellDisplayRectangle, чтобы найти местоположение ячейки внутри сетки, и добавил это местоположение расположения прямоугольника выделения:
CellRectangle = Cell.DataGridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
HighLightedRect = new Rectangle((Point)SizeBeforeHighLight, HighLightedSize);
HighLightedRect.Location = new Point(CellRectangle.Location.X + SizeBeforeHighLight.Width, CellRectangle.Location.Y + Cell.ContentBounds.Top);
С этого момента он просто использует FillRectangle и DrawString объекта Graphics:
g.FillRectangle(new SolidBrush(Color.Black), HighLightedRect);
g.DrawString(HighlighetText, dgvGrid.Font, new SolidBrush(Color.White), HighLightedRect.Location);
g.Flush();
и, конечно, не забудьте установить свойство Handled для e в значение true, когда закончите:
e.Handled = true;
Да, и еще одна вещь: вам нужно будет сделать недействительной всю сетку или, по крайней мере, ячейки, которые были выделены в предыдущем поиске каждый раз, когда вы будете искать новую строку, в противном случае вы получите сетку, заполненную текст, не имеющий отношения к текущей строке поиска.