personalizar formato defaultcellstyle dar c# datagridview highlighting

c# - formato - Resaltar parte de un texto en una celda de datagridview



defaultcellstyle.format datagridview c# (2)

¿Cómo puedo destacar parte de un texto en una celda de datagridview? Estoy usando C #.
Por ejemplo, libro de búsquedas del usuario. en las celdas contiene marcador. Quiero resaltar "libro" en marcador. Gracias.

Edición. ¿Está bien este código?

Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting If e.RowIndex >= 0 And e.ColumnIndex >= 0 Then e.Handled = True e.PaintBackground(e.CellBounds, True) Dim sw As String = GetSearchWord(e.ColumnIndex) If Not String.IsNullOrEmpty(sw) Then Dim val As String = DirectCast(e.FormattedValue, String) Dim sindx As Integer = val.ToLower.IndexOf(sw.ToLower) If sindx >= 0 Then ''the highlite rectangle Dim hl_rect As New Rectangle() hl_rect.Y = e.CellBounds.Y + 2 hl_rect.Height = e.CellBounds.Height - 5 ''find the size of the text before the search word ''and the size of the search word Dim sBefore As String = val.Substring(0, sindx) Dim sWord As String = val.Substring(sindx, sw.Length) Dim s1 As Size = TextRenderer.MeasureText(e.Graphics, sBefore, e.CellStyle.Font, e.CellBounds.Size) Dim s2 As Size = TextRenderer.MeasureText(e.Graphics, sWord, e.CellStyle.Font, e.CellBounds.Size) ''adjust the widths to make the highlite more accurate If s1.Width > 5 Then hl_rect.X = e.CellBounds.X + s1.Width - 5 hl_rect.Width = s2.Width - 6 Else hl_rect.X = e.CellBounds.X + 2 hl_rect.Width = s2.Width - 6 End If ''use darker highlight when the row is selected Dim hl_brush As SolidBrush If ((e.State And DataGridViewElementStates.Selected) <> DataGridViewElementStates.None) Then hl_brush = New SolidBrush(Color.DarkGoldenrod) Else hl_brush = New SolidBrush(Color.LightGoldenrodYellow) End If ''paint the background behind the search word e.Graphics.FillRectangle(hl_brush, hl_rect) hl_brush.Dispose() End If End If ''paint the content as usual e.PaintContent(e.CellBounds) End If End Sub


No creo que haya ninguna forma de hacerlo, pero supongo que podría manejar el evento CellPainting de DataGridView , establecer e.Handled = true; y luego dibuja tú mismo como lo necesites.

Es posible que pueda utilizar PaintBackground para minimizar la cantidad de trabajo que tiene que hacer usted mismo.


Yo también estaba buscando una manera de hacer eso. Después de ir al evento CellPainting obvio, descubrí que usar el objeto Graphics del evento no funcionaba. Sin embargo, logré usar el objeto Graphics del método DataGridView.GetGraphics () para resaltar una parte del texto. Supongo que ya sabes cómo encontrar la celda que contiene la cadena que buscas. Dentro del evento CellPainting, lo primero que debes hacer es pintar la celda como cualquier otra celda:

e.Paint(e.ClipBounds, DataGridViewPaintParts.All);

Lo siguiente que debe hacer es dividir el texto de la celda en 2 partes: la parte anterior al texto de búsqueda y el texto de búsqueda en sí. lo necesita para calcular el rectángulo donde desea resaltar.

Luego use el método MeasureString del objeto Graphics para obtener la ubicación del texto de búsqueda dentro de la celda. Como utilizo el objeto Graphics relacionado con la cuadrícula, y no el objeto Graphics del evento, tuve que calcular la ubicación del rectángulo de resaltado dentro de la grilla. Utilicé el método DataGridView.GetCellDisplayRectangle para buscar la ubicación de la celda dentro de la cuadrícula y agregué esta ubicación de la ubicación del rectángulo resaltado:

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);

A partir de ese punto, simplemente está utilizando FillRectangle y DrawString del objeto Graphics:

g.FillRectangle(new SolidBrush(Color.Black), HighLightedRect); g.DrawString(HighlighetText, dgvGrid.Font, new SolidBrush(Color.White), HighLightedRect.Location); g.Flush();

y, por supuesto, no se olvide de establecer la propiedad Manipulada de e en verdadero cuando haya terminado:

e.Handled = true;

Ah, y una última cosa: tendrá que invalidar toda la grilla, o al menos las celdas que se destacaron en la búsqueda anterior cada vez que busca una nueva cadena, de lo contrario terminará con una grilla llena de texto resaltado que tiene nada que ver con la cadena de búsqueda actual.