Announcement

Collapse
No announcement yet.

Kann man in einem DataGrid einzelne Zellen formatieren ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kann man in einem DataGrid einzelne Zellen formatieren ?

    Hallo !

    Ich möchte in einem DataGrid einzelne Zellen formatieren (z.B.: eine andere Farbe falls ein bestimmter Wert überschritten wird). Im DataGrid in Borlands VCL wurde dazu ein OnDrawCell-Ereignis vom DataGrid ausgelöst. Gibt es etwas vergleichbares auch beim DataGrid aus .NET, oder hat man hier andere Möglichkeiten um einzelne Zellen zu formatieren ?

  • #2
    Hallo,

    beim DataGrid führt der Weg über die <b>TableStyles</b>-Eigenschaft. Dieser auf den ersten Blick "umständliche" Weg ist notwendig, weil das DataGrid im Gegensatz zu Delphi zur gleichen Zeit völlig unterschiedliche Tabellen anzeigen kann (Bsp: Automatischer Master-Detail-Link). Daher muss die Reaktion auf einen bestimmten Wert nicht dem DataGrid selbst zugeordnet werden, sondern der Klasse, die für eine bestimmte Tabelle zuständig ist. Das folgende Beispiel kennzeichnet negative Beträge durch rote Schrift und gelben Zellenhintergrund.

    Schritt 1: DataGridTextBoxColumn-Nachfolger definiert das Aussehen, indem die geerbte <b>Paint</b>-Methode überschrieben wird.
    <pre>
    Public Class OSColorTextBoxColumn
    Inherits DataGridTextBoxColumn

    Protected Overloads Overrides Sub Paint(ByVal graph As Graphics, _
    ByVal rectbounds As Rectangle, ByVal curmngrSrc As _
    CurrencyManager, ByVal RowNumber As Integer, ByVal _
    ForeColorBrush As Brush, ByVal BackColorBrush As Brush, _
    ByVal AlignmentRight As Boolean)

    Dim ObjVal As Object
    ObjVal = Me.GetColumnValueAtRow(curmngrSrc, RowNumber)
    ' eigene Behandlung
    If Not (IsNothing(ObjVal) Or IsDBNull(ObjVal)) Then
    Dim cellValue As Integer
    cellValue = CType(ObjVal, Integer)
    If (cellValue < 0) Then
    BackColorBrush = Brushes.Yellow
    ForeColorBrush = Brushes.Red
    Else
    BackColorBrush = Brushes.White
    ForeColorBrush = Brushes.Black
    End If
    End If
    ' Basisklasse übernimmt die Darstellung
    MyBase.Paint(graph, rectbounds, curmngrSrc, RowNumber, _
    BackColorBrush, ForeColorBrush, AlignmentRight)
    End Sub

    End Class
    </pre>
    Schritt 2: Der DataGridTextBoxColumn-Nachfolger wird für das DataGrid aktiviert, indem die eigenen Klassen der <b>TableStyles</b>-Eigenschaft des DataGrid zugewiesen werden.
    <pre>
    Private Sub SetTableStyle(ByVal aGrid As DataGrid, ByVal aDT As DataTable)
    Dim aDGTS As New DataGridTableStyle
    aDGTS.MappingName = aDT.TableName
    Dim j As Integer
    For j = 0 To aDT.Columns.Count - 1
    Dim aOSCTBC As New OSColorTextBoxColumn
    aOSCTBC.MappingName = aDT.Columns(j).ColumnName
    aOSCTBC.HeaderText = aDT.Columns(j).ColumnName
    aDGTS.GridColumnStyles.Add(aOSCTBC)
    Next j
    aGrid.TableStyles.Clear()
    aGrid.TableStyles.Add(aDGTS)
    End Sub

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.SqlDataAdapter1.Fill(Me.DataSet11)
    SetTableStyle(Me.DataGrid1, Me.DataSet11.TESTTBL)
    End Sub
    </pre&gt

    Comment


    • #3
      Vielen Dank, hat echt super geklappt.

      Ein Problem habe ich aber noch:
      Ich möchte den Text im Spalten-Header anders ausrichten, als die Spaltenwerte (z.B.: Header, Center; Daten, Right). Kann das Zeichnen des Headers auch abgefangen werden ?
      Bei Rownumber == 0 wird ja bereits die erste Datenzeile gezeichnet.
      Oder gibt es eine Einstellung, um die Textausrichtung des Spalten-Headers unabhängig zu gestalten

      Comment


      • #4
        Hallo,

        &gt;Oder gibt es eine Einstellung, um die Textausrichtung des Spalten-Headers unabhängig zu gestalten ?

        Der Dialog aus VS.NET hat so etwas nicht im Angebot

        Comment

        Working...
        X