vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · DataGrid & DataGridView   |   VB-Versionen: VB2005, VB200807.11.08
Fix-Columns im DataGridView hervorheben

Hier wird eine Methode zur optischen Kennzeichnung der Fix-Columns in einem Datagridview vorgestellt.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  13.356 
ohne HomepageSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Wenn man in einem DataGridView-Control Columns fixiert hat, scrollen die die restlichen sozusagen "unter den fixierten hinweg". Um die Abgrenzung zwischen fixierten und nicht fixierten Spalten grafisch hervorzuheben, kann man nachfolgenden Tipp verwenden.

Bei diesem Beispielcode (siehe auch Abbildung rechts) ist bspw. die Spalte "KdNr" die letzte rechte fixierte Spalte im DataGridView. Mittels folgendem Code im CellPainting-Ereignis des Controls kan man recht gut die Abgrenzung zu den nicht fixierten Spalten kennzeichnen.

Fix-Columns im DataGridView hervorheben

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
  Handles DataGridView1.CellPainting
 
  With DataGridView1
    If e.RowIndex >= 0 AndAlso Not .Rows(e.RowIndex).IsNewRow AndAlso _
      e.ColumnIndex >= 0 AndAlso .Columns(e.ColumnIndex).Name = "KdNr" Then
 
      ' Breite des Verlaufsrechtecks
      Const rectW = 6
      Dim randRect As New Rectangle(e.CellBounds.Right - rectW, e.CellBounds.Y, _
        rectW, e.CellBounds.Height - 1)
 
      ' Zellen-Hintergrundfarbe
      Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)
 
      ' Farbverlauf für die Abgrenzungslinie
      Dim gridBrush As LinearGradientBrush
      gridBrush = New LinearGradientBrush(randRect, e.CellStyle.BackColor, _
        Color.Gray, LinearGradientMode.Horizontal, False)
 
      ' Farbe der Gitterlinien
      Dim gridLinePen As New Pen(DataGridView1.GridColor)
 
      ' StringFormat für Textdarstellung
      Dim sf As New StringFormat
      With sf
        .FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.FitBlackBox
        .LineAlignment = StringAlignment.Center
        .Alignment = StringAlignment.Near
        .Trimming = StringTrimming.None
      End With
 
      With e.Graphics
        ' Hintergrund der Zelle füllen
        .FillRectangle(backColorBrush, e.CellBounds)
 
        ' Gitterlinien zeichnen
        .DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, _
          e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
 
        ' Hintergrund-Farbverlauf zeichnen
        .FillRectangle(gridBrush, randRect)
 
        If Not (e.Value Is Nothing) And e.Value IsNot DBNull.Value Then
          ' Rechteck für Textanzeige des Zelleninhaltes
          Dim r As Rectangle
          With r
            .Width = (e.CellBounds.Right - 2) - (e.CellBounds.Left + 2)
            .Height = (e.CellBounds.Bottom - 2) - (e.CellBounds.Top + 2)
            .X = e.CellBounds.X + 2
            .Y = e.CellBounds.Y + 2
          End With
 
          ' Zelleninhalt ausgeben
          .TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
          .DrawString(CStr(e.Value), e.CellStyle.Font, Brushes.Black, r, sf)
          r = Nothing
        End If
      End With
 
      ' Rückgabe, dass das Zeichnen der Zelle manuell erfolgte
      e.Handled = True
    End If
  End With
End Sub

Update vom 18.05.09
Überarbeitung / Ergänzung, so dass bspw. die selektierten Zeilen besser beachtet werden und vor allem, dass auch die Headerzeile mit gekennzeichnet wird.

''' <summary>
''' Zeichnen der letzten Frozen-Zelle mit rechtem Rand
''' (muss im Cellpainting-Ereignis des Datagridviews geschehen)
''' </summary>
''' <param name="dgv">Datagridview-Control</param>
''' <param name="e">DataGridViewCellPaintingEventArgs</param>
''' <param name="cName">Spaltenname der letzten rechten Frozen-Spalte</param>
''' <param name="rectW">Breite des Abgrenzungsrandes</param>
''' <param name="grColor">Farbe zur Kennzeichnung</param>
Public Sub paintFrozenBorder(ByVal dgv As DataGridView, _
  ByVal e As DataGridViewCellPaintingEventArgs, _
  ByVal cName As String, _
  ByVal rectW As Short, _
  ByVal grColor As Color)
 
  Dim bColor As Color
  Dim backColorBrush, textBrush As Brush
  Dim gridBrush As LinearGradientBrush
  Dim randRect As Rectangle
 
  ' Farbe der Gitterlinien des Datagridview
  Dim gridLinePen As New Pen(dgv.GridColor)
 
  ' Headerzellen
  With e
    If .ColumnIndex >= 0 AndAlso .RowIndex = -1 _
      AndAlso dgv.Columns(cName).Index = .ColumnIndex Then
 
      ' Zellen-Hintergrundfarbe
      backColorBrush = New SolidBrush(.CellStyle.BackColor)
      .Graphics.FillRectangle(backColorBrush, .CellBounds)
      .Paint(e.ClipBounds, (DataGridViewPaintParts.All))
      randRect = New Rectangle(.CellBounds.Right - rectW, _
        .CellBounds.Y, rectW, .CellBounds.Height - 1)
 
      ' Farbverlauf für die Abgrenzungslinie
      gridBrush = New LinearGradientBrush(randRect, bColor, _
        grColor, LinearGradientMode.Horizontal, False)
      .Graphics.FillRectangle(gridBrush, randRect)
 
      ' Rückgabe, dass das Zeichnen der Zelle manuell erfolgte
      .Handled = True
    End If
  End With
 
  ' Wertezellen
  If e.ColumnIndex >= 0 AndAlso dgv.Columns(cName).Index = e.ColumnIndex AndAlso e.RowIndex >= 0 _
    AndAlso Not dgv.Rows(e.RowIndex).IsNewRow Then
 
    randRect = New Rectangle(e.CellBounds.Right - rectW, _
      e.CellBounds.Y, rectW, e.CellBounds.Height - 1)
    If dgv.Rows(e.RowIndex).Selected Then
      bColor = e.CellStyle.SelectionBackColor
      textBrush = New SolidBrush(e.CellStyle.SelectionForeColor)
    Else
      bColor = e.CellStyle.BackColor
      textBrush = New SolidBrush(e.CellStyle.ForeColor)
    End If
 
    ' Zellen-Hintergrundfarbe
    backColorBrush = New SolidBrush(bColor)
 
    ' Farbverlauf für die Abgrenzungslinie
    gridBrush = New LinearGradientBrush(randRect, bColor, _
      grColor, LinearGradientMode.Horizontal, False)
 
    ' StringFormat für Textdarstellung
    Dim sf As New StringFormat
    With sf
      .FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.FitBlackBox
      .LineAlignment = StringAlignment.Center
      .Alignment = StringAlignment.Near
      .Trimming = StringTrimming.None
    End With
    With e.Graphics
      ' Hintergrund der Zelle füllen
      .FillRectangle(backColorBrush, e.CellBounds)
 
      ' Gitterlinien zeichnen
      .DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, _
        e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
      ' Hintergrund-Farbverlauf zeichnen
      .FillRectangle(gridBrush, randRect)
      If Not (e.Value Is Nothing) And e.Value IsNot DBNull.Value Then
        ' Rechteck für Textanzeige des Zelleninhaltes
        Dim r As Rectangle
        With r
          .Width = (e.CellBounds.Right - 2) - (e.CellBounds.Left + 2)
          .Height = (e.CellBounds.Bottom - 2) - (e.CellBounds.Top + 2)
          .X = e.CellBounds.X + 2
          .Y = e.CellBounds.Y + 2
        End With
 
        ' Zelleninhalt ausgeben
        .TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
        .DrawString(CStr(e.Value), e.CellStyle.Font, textBrush, r, sf)
        r = Nothing
      End If
    End With
 
    ' Rückgabe, dass das Zeichnen der Zelle manuell erfolgte
    e.Handled = True
  End If
End Sub

Und hier ein Beispiel des Aufrufs im CellPainting-Ereignis des Datagridview:

  Private Sub DataGridView1_CellPainting(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
  Handles DataGridView1.CellPainting
 
  paintFrozenBorder(DataGridView1, e, "KdNr", 6, Color.Gray)
End Sub

Dieser Tipp wurde bereits 13.356 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel