Zelle im DGV abhängig von Value verfärben

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zelle im DGV abhängig von Value verfärben

    Hallo,

    ich habe ein DGV, das an eine Tabelle gebunden ist. Es sind 2 Spalten, eine Integer und eine Boolean. Ich möchte gerne, dass bei einer Boolean-Spalte die Hintergrundfarbe rot bei False und grün bei True ist. Text brauche ich da keins.
    Wie mache ich das am besten? Soll es eine TextBoxColumn sein? In welchem Event soll ich das machen, um nicht zu sehr im DGV rumzuwühlen? Ich muss ja die Value noch abfragen...

    LG
    Trennung von Daten und GUI. Aus einem Steuerelement fragt man i.d.R. keine Daten ab, man zeigt sie lediglich an.

    Ansosnten kann man über dgv.Rows[index].Cells[index].Style für jede einzelne Zelle ein eigenes Style übergeben.
    Wie schön oder unschön das nun ist, kann ich nicht sagen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    EaranMaleasi schrieb:

    Trennung von Daten und GUI. Aus einem Steuerelement fragt man i.d.R. keine Daten ab, man zeigt sie lediglich an.

    Ach, echt? :P Warum frage ich denn sonst?

    Meine Daten liegen in der Tabelle, nur muss jetzt Rot oder Grün bei False oder True angezeigt werden, und das gehört zu GUI.
    Ich weiß, dass ich die Zelle über Index ansprechen kann und .BackColor von TextBoxColumn verändern kann. Aber da muss ich ja den zugehörigen Wert abfragen und das soll ja über BindingSource laufen.
    Ich würde im .RowsAdded eine for each schleife einbauen und den Wert prüfen.
    Und dann den Code von Earan umsetzen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Wie willst du das denn sonst machen? Irgend woher muss dein DGV doch wissen ob der wert True oder False ist.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Das weiß er über die Bindingsource, die Spalte ist ja an DataTable vom DataSet gebunden.

    Ich habe ein UserControl, in dem sich das DGV befindet (unter anderem), da würde ich es im Event auch handeln. Aber eben über die BindingSource.

    So, habe das hier im UserControl geschrieben, aber noch nicht getestet:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    2. If e.ColumnIndex = 1 Then
    3. Select Case ValueBindingSource.At(Of DataSet1.ValueRow).Status
    4. Case True
    5. DataGridView1.CurrentCell.Style.BackColor = Color.Green
    6. Case False
    7. DataGridView1.CurrentCell.Style.BackColor = Color.Red
    8. End Select
    9. End If
    10. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    Das sollte funktionieren. Sieht auf den ersten Blick korrekt aus. Aber eigentlich machst du das gleiche wie ich mit dem .rowsadded
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hey,

    nutze das CellPainting-Event. In den EventArgs findest Du einen RowIndex, der direkt dem Index innerhalb der BindingSource entspricht. Sprich, Du kannst die entsprechende Row casten und prüfen, ob Dein Bool True oder False ist. Was dann noch zu tun ist, Du musst prüfen, ob gerade die gewünschte Spalte des GridViews gezeichnet wird. Kurzes Beispiel:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
    2. If e.RowIndex > -1 AndAlso DataTable1BindingSource.Count - 1 >= e.RowIndex Then
    3. Dim row As DataSet1.DataTable1Row = DirectCast(DirectCast(DataTable1BindingSource.Item(e.RowIndex), DataRowView).Row, _
    4. DataSet1.DataTable1Row)
    5. If e.ColumnIndex = 3 Then
    6. e.CellStyle.BackColor = If(row.DataColumn4, Color.Green, Color.Red)
    7. End If
    8. End If
    9. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ja, ich glaube, ".At" ohne Index geht gar nicht, weil nichts ausgewählt wurde. Wann wird denn CellPainting-Event aufgerufen (bestimmt häufiger als ValueChanged, oder)? Warum kann ich nicht ValueChanged-Event nutzen?

    Im Endeffekt brauche ich nur die andere Überladung von "At", wo ich Index angeben kann, den Rest kann ich ja lassen:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    2. If e.ColumnIndex = 1 Then
    3. Select Case ValueBindingSource.At(Of DataSet1.ValueRow)(e.RowIndex).Status
    4. Case True
    5. DataGridView1.CurrentCell.Style.BackColor = Color.Green
    6. Case False
    7. DataGridView1.CurrentCell.Style.BackColor = Color.Red
    8. End Select
    9. End If
    10. End Sub