vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Controls · DataGrid & DataGridView   |   VB-Versionen: VB2005, VB200817.08.09
Zeilennummer im DataGridView-RowHeader anzeigen

Der Tipp zeigt eine Möglichkeit bspw. die Zeilennummern eines DatagridViews in die Zelle des RowHeaders zu schreiben.

Autor:   Dietrich HerrmannBewertung:  Views:  22.954 
ohne HomepageSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Unter dem Link Showing-Row-Number-in-DataGridView fand ich einen Lösungsvorschlag zu oben genanntem Sachverhalt. Im CellPainting-Ereignis kann man realisieren, dass bspw. die Zeilennumer im Rowheader mit angezeigt wird. Den Originalcode habe ich noch etwas verändert.

Schaut man sich den Code an, entdeckt man, dass eigentlich nicht nur die Zeilennummer dort hingeschrieben werden kann, sondern auch x-beliebiger Text. Man muss nur beachten, dass die Breite des Rowheaders entsprechend eingestellt wird.

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _
  ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
 
  If e.ColumnIndex = -1 And e.RowIndex >= 0 Then
    Dim font As Font = sender.RowHeadersDefaultCellStyle.Font
    Dim dFont As Font = New Font(font.FontFamily, font.Size, FontStyle.Bold)
    With e
      Dim StringSize As SizeF = New SizeF(TextRenderer.MeasureText(.RowIndex, _
        dFont).Width, TextRenderer.MeasureText(.RowIndex, dFont).Height)
 
      .PaintBackground(.ClipBounds, False)
      .PaintContent(.ClipBounds)
 
      Using brush As New SolidBrush(sender.RowHeadersDefaultCellStyle.ForeColor)
        .Graphics.DrawString(.RowIndex.ToString, dFont, brush, _
          .CellBounds.Right - StringSize.Width, _
          .CellBounds.Top + (.CellBounds.Height - StringSize.Height) / 2)
      End Using
      .Handled = True
    End With
  End If
End Sub

Tipp-Update vom 23.02.2011
Obiger Code wurde ein wenig erweitert. Mit nachfolgender Prozedur, die im CellPaint-Event des DataGridView-Controls aufgerufen werden muss, lässt sich nicht nur die Farbe der Zeilennummern festlegen, sondern auch, ob nur die letzte Zeile numeriert werden soll oder nur die gerade selektierte Datenzeile.

  ''' <summary>
''' Schreiben der Zeilennummern in die RowHeader-Zelle
''' </summary>
''' <param name="dgv">das DatagridView</param>
''' <param name="e">DataGridViewCellPaintingEventArgs</param>
''' <param name="nColor">wenn andere Farbe als default verwendet werden soll</param>
''' <param name="lastRowOnly">wenn nur die letzte Zeile nummeriert werden soll</param>
''' <param name="selRowOnly">wenn nur die selektierte Zeile nummeriert werden soll</param>
''' <remarks >im Cellpaint-Ereignis des Datagridviews anwenden!</remarks>
Public Sub RownumberToHeader(ByVal dgv As DataGridView, _
    ByVal e As DataGridViewCellPaintingEventArgs, _
    Optional ByVal nColor As Object = Nothing, _
    Optional ByVal lastRowOnly As Boolean = False, _
    Optional ByVal selRowOnly As Boolean = False)
 
  Dim w As Boolean, numColor As Color, dFont As Font
 
  With dgv
    If .RowCount < 2 Then Exit Sub
 
    Dim font As Font = .RowHeadersDefaultCellStyle.Font
    dFont = New Font(font.FontFamily, font.Size, FontStyle.Bold)
 
    Dim rc As String = Format(.RowCount, "#,##0")
    Dim maxSize As SizeF = New SizeF(TextRenderer.MeasureText(rc, dFont).Width, _
      TextRenderer.MeasureText(rc, dFont).Height)
 
    .RowHeadersWidth = maxSize.Width + 25
 
    numColor = .RowHeadersDefaultCellStyle.ForeColor
    If nColor IsNot Nothing Then numColor = nColor
 
    Dim k As Short = IIf(.AllowUserToAddRows = True, 2, 1)
    Dim ri As Integer = 0
 
    w = (e.ColumnIndex = -1 And e.RowIndex >= ri)
    If lastRowOnly Then
      ri = .RowCount - k
      w = (e.ColumnIndex = -1 And e.RowIndex >= ri)
    ElseIf selRowOnly And dgv.SelectedRows.Count > 0 Then
      ri = .SelectedRows(0).Index
      w = (e.ColumnIndex = -1 And e.RowIndex = ri)
    End If
  End With
 
  If w Then
    If dgv.Rows(e.RowIndex).IsNewRow = False Then
      With e
        Dim rowStr As String = Format(.RowIndex + 1, "#,##0")
        Dim StringSize As SizeF = New SizeF( _
          TextRenderer.MeasureText(rowStr, dFont).Width, _
          TextRenderer.MeasureText(rowStr, dFont).Height)
 
        .PaintBackground(.ClipBounds, False)
        .PaintContent(.ClipBounds)
 
        Using brush As New SolidBrush(numColor)
          .Graphics.DrawString((rowStr).ToString, dFont, brush, _
            .CellBounds.Right - StringSize.Width, _
            .CellBounds.Top + (.CellBounds.Height - StringSize.Height) / 2)
        End Using
 
        .Handled = True
      End With
    End If
  End If
End Sub

Aufrufbeispiel:

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _
  ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
 
  ' alle Zeilennummern in roter Schrit anzeigen 
  RownumberToHeader(sender, e, Color.Red)
End Sub



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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle 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.