vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2018
 
zurück
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:     [ Jetzt bewerten ]Views:  18.930 
ohne HomepageSystem:  Win2k, WinXP, Vista, Win7, Win8, Win10 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

Dieser Tipp wurde bereits 18.930 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.

Aktuelle Diskussion anzeigen (12 Beiträge)

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-2018 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