2010-08-10 4 views
3

Comment mettre en surbrillance une partie d'un texte dans une cellule de datagridview? J'utilise C#.
Par exemple, le livre de recherche de l'utilisateur. sur des cellules contient un signet. Je veux mettre en évidence "livre" dans le signet. Merci.Mettre en surbrillance Partie d'un texte dans une cellule de datagridview


Édition. Ce code est-il correct?

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 
+0

Par partie, vous voulez dire une partie du texte inséré, du texte entier ou quoi? –

+0

Une partie du texte. par exemple un livre recherché par l'utilisateur. sur des cellules contient un signet. Je veux mettre en évidence "livre" dans le signet. – Shahin

Répondre

2

Je ne pense pas qu'il y ait construit de façon de le faire, mais je suppose que vous pouvez gérer l'événement CellPainting du DataGridView, réglez e.Handled = true; puis dessinez vous-même que vous en avez besoin.

Vous pourriez être en mesure d'utiliser PaintBackground pour minimiser la quantité de travail que vous avez à faire vous-même.

3

Je cherchais aussi un moyen de le faire. Après être allé à l'événement évident CellPainting, j'ai trouvé que l'utilisation de l'objet Graphics de l'événement ne faisait pas l'affaire. Cependant, j'ai réussi à utiliser l'objet Graphics de la méthode DataGridView.GetGraphics() pour faire ressortir une partie du texte. Je suppose que vous savez déjà comment trouver la cellule qui contient la chaîne que vous recherchez. l'intérieur de l'événement CellPainting la première chose que vous voulez faire est de peindre la cellule comme une autre cellule:

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

La prochaine chose à faire est de diviser le texte de la cellule à 2 parties - la partie avant que le texte de recherche et le texte de recherche lui-même. vous en avez besoin pour calculer le rectangle où vous voulez mettre en évidence.

Ensuite, utilisez la méthode MeasureString de l'objet Graphics pour obtenir l'emplacement du texte de recherche dans la cellule. Puisque j'utilise l'objet Graphics lié à la grille elle-même, et non l'objet Graphics de l'événement, j'ai dû calculer l'emplacement du rectangle de surbrillance dans la grille. Je l'ai utilisé la méthode DataGridView.GetCellDisplayRectangle pour trouver l'emplacement de la cellule à l'intérieur de la grille, et a ajouté cet endroit de l'emplacement du rectangle en surbrillance:

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 là il utilise simplement le FillRectangle et DrawString du objet graphique:

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

et bien sûr, ne pas oublier de définir la propriété Handled de e true lorsque vous avez terminé:

e.Handled = true; 

Oh, et l Astuce: Vous devrez invalider toute la grille, ou au moins les cellules qui ont été mises en surbrillance dans la recherche précédente chaque fois que vous recherchez une nouvelle chaîne, sinon vous finirez avec une grille pleine de texte en surbrillance qui n'a rien à voir avec la chaîne de recherche actuelle.

Questions connexes