none
DataGridView Zellenfarbe ändern durch SQL Wert RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe sehr viel probiert und sehr viel Googelt. Leider finde ich nur komplexe Antworten die ich als leihe in VB nicht verstehe.

    Ich will den Wert "Ja" im DataGridView (DataGridView1) Grün färben und "Nein" Rot Färben samt Hintergrund und Schrift.

    Die Werte kommen aus einer SQL View. 

    Ich habe 5 Spalten.

    1.Name

    2.Abteilung 

    3.Durchwahl

    4.Kürzel

    5.ANWESEND

    Ich möchte nur die die Spalte 5. ANWESEND je nachdem ob jemand Anwesend ist farblich darstellen lassen.


    Bitte um Eure Hilfe.

    Vielen vielen Dank

    Donnerstag, 14. Juni 2018 08:15

Antworten

  • Ok,

    dann war im ersten If (zweite zeile) ein (-1) zuviel, probiere es mal so:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count Then
            Exit Sub
        End If
        Dim ANWESEND As Integer
        Dim intCol As Integer = DataGridView1.Columns("Anwesend").Index
        If e.ColumnIndex = intCol Then
            ANWESEND = e.Value
            If ANWESEND = 1 Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Grüße

    Roland

    Montag, 18. Juni 2018 06:20

Alle Antworten

  • Hallo Ivandrago1988,

    ich gehe einmal von Windows Form aus, da Du von Datagridview schreibst.

    Die Lösung ist im Ereigniss "CellFormatting" zu finden.

    Hier mal ein Beispiel, das Du natürlich noch an Deine Gegebheiten anpassen musst:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count - 1 Then
            Exit Sub
        End If
        Dim bAnwesenheit As Boolean
        If e.ColumnIndex = 5 Then
            bAnwesenheit = e.Value
            If bAnwesenheit Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Grüße

    Roland


    • Bearbeitet Roland Franz Donnerstag, 14. Juni 2018 12:33
    • Als Antwort vorgeschlagen Florian Haupt Freitag, 15. Juni 2018 06:59
    Donnerstag, 14. Juni 2018 11:59
  • Hallo Roland,

    Danke für die Rasche Antwort.  Gibt es die Möglichkeit in der Spalte die werte ANWESEND 0=Rot und 1=Grün darzustellen?

    Danke im Voraus

    Freitag, 15. Juni 2018 06:40
  • Du meinst die Spalte ANWESEND enhält die Werte 0 oder 1?

    Klar, dann würde der Code so aussehen:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count - 1 Then
            Exit Sub
        End If
        Dim Anwesend As Integer
        If e.ColumnIndex = 5 Then
            Anwesend = e.Value
            If Anwesend = 1 Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Die Zeile

     If e.ColumnIndex = 5 Then

    musst Du natürlich auch noch an Deinen Code anpassen!

    Freitag, 15. Juni 2018 07:57
  • Hallo Roland,

    Leider wird nichts in Farbe dargestellt. Ich weiß einfach nicht was ich falsch mach.

    Wenn aus der SQL Tabelle die 5.Spalte "ANWESEND" nur die werte 0 und 1 beinhaltet muss der CODE vor End Class eingefügt werden. Stimmt das dann soweit?

      Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count - 1 Then
            Exit Sub
        End If
        Dim ANWESEND As Integer
        If e.ColumnIndex = 5 Then
            ANWESEND = e.Value
            If ANWESEND = 1 Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Vielen Dank Roland


    Freitag, 15. Juni 2018 10:09
  • Hallo Ivandrago1988,

    der Index bezieht sich auf die Spalten des DataGridView, nicht auf die Tabelle von SQLServer.

    Grüße

    Roland

    Freitag, 15. Juni 2018 10:11
  • Falls Du den Index nicht kennst, aber den Spaltennamen des DatagridView kannst Du auch folgenden Code ändern:

    Dim intCol As Integer = DataGridView1.Columns("Anwesend").Index
        If e.ColumnIndex = intCol Then
    .
    .

    dabei musst Du aber auch darauf achten dass das der Name der Spalte des DataGridView ist und nicht der SQLServer-Tabelle.

    Freitag, 15. Juni 2018 10:14
  • Hallo Roland,

    Jetzt haben sich die Spalten 1-4 Rot gefärbt und die 5 Grün.

    die Spalten sind von der SQL Tabelle. Da wurde eine VIEW angelegt und von der Abgefragt.

    Danke Roland


    Freitag, 15. Juni 2018 10:30
  • also jeweils die ganze Spalte?

    Dann hast Du wahrscheinlich die folgenden Bedingung die den Zellenwert prüft entfernt.

    Es müsste bei Dir also in der 5. Spalte eine 1 oder 0 stehen die jetzt komplett grün ist richtig?

    Hier noch mal die komplette Routine:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count - 1 Then
            Exit Sub
        End If
        Dim ANWESEND As Integer
        Dim intCol As Integer = DataGridView1.Columns("Anwesend").Index
        If e.ColumnIndex = intCol Then
            ANWESEND = e.Value
            If ANWESEND = 1 Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Freitag, 15. Juni 2018 11:00
  • Hallo Roland,

    Jetzt weiß ich was du davor gemeint hast mit dem Index. Habe jetzt die Spalten von der SQL View als dataset in die DGF eingebaut. Die DGF hat jetzt eigene Spalten die immer da stehen. 

    Leider kommt diese Fehelermeldung

    Danke Roland

    Freitag, 15. Juni 2018 11:01
  • Dann heißt die Spalte nicht "ANWESEND".

    Du musst mal im Designer vom DatgridView nachschauen wie der Name der Spalte wirklich heißt.

    In der Regel wird der per Default z.B. so "DataGridViewTextBoxColumn5" genannt.

    Freitag, 15. Juni 2018 11:10
  • Guten Morgen Roland,

    Jetzt hat es geklappt mit dem letzten Code den du geschickt hast.

    Leider ist die Letzte Zeile nicht gefärbt. Spricht wenn ich eine Suche mache wird die letzte Zeile in der Tabelle normal dargestellt.

    Vielen Dank Roland

    Montag, 18. Juni 2018 05:58
  • Ok,

    dann war im ersten If (zweite zeile) ein (-1) zuviel, probiere es mal so:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        If e.RowIndex < 0 Or e.RowIndex >= DataGridView1.Rows.Count Then
            Exit Sub
        End If
        Dim ANWESEND As Integer
        Dim intCol As Integer = DataGridView1.Columns("Anwesend").Index
        If e.ColumnIndex = intCol Then
            ANWESEND = e.Value
            If ANWESEND = 1 Then
                e.CellStyle.BackColor = Color.Green
            Else
                e.CellStyle.BackColor = Color.Red
            End If
        End If
    End Sub

    Grüße

    Roland

    Montag, 18. Juni 2018 06:20
  • Roland,

    du bist der Beste. Vielen Dank. 

    Es braucht mehr Leute wie dich in Foren.

    Vielen vielen Dank

    LG

    Drago

    Montag, 18. Juni 2018 06:49