Color Property in DataTable

  • VB.NET
  • .NET 4.5

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von gegy.

    Color Property in DataTable

    Hallo Leute,

    ich hab ne Liste von Instanzen eines Objects und übergebe diese als Datasource an ein DatagridView.
    Die Instanzen haben unter anderem eine Eigenschaft "Farbe" welche ein Color Object zurückliefern.
    Im DataGridView werden die Farben auch schön in einer Spalte pro Zeile angezeigt, jedoch stehen als Text auch die RGB Werte in den farbigen Zellen.

    Nun habe ich zwei Fragen dazu:

    1.) Gibt es ein Property Attribut welches ich setzen kann, damit nur die Farbe angezeigt wird ohne den Text (RGB Werte)?
    2.) Kann ich über den SelectHandler der Zelle mit einem "ColorPicker" die Farbe ändern und gleich ins Property zurückschreiben?

    Vielen Dank für eure Hilfe!
    @gegy Für Ersteres gibt es das CellPainting-Event des DGV.
    Du fragst Zeile und Spalte ab und stellst dar, was darzustellen ist.
    Bei Letzterem musst Du entsprechend die DataSource, hier wohl eine DataTable, ändern.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Das verwundert mich aber, das das DGV die Zelle automatisch bunt macht, bei Spalten vom Datentyp Color.


    Warte mal, du hast recht. Ich hab doch tatsächlich Programmieraufwand betrieben. Hmmm.... da habe ich doch glatt was übersehen. Ich färbe die Zellen ein und glaube die RGB Codes kommen vom Model.

    *Vollzitat entfernt* ~NoFear23m

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

    na - dieser Code wäre interessant zu sehen.
    Höchstwahrscheinlich kann man ihn so ändern, dasser tut, wasser soll.



    zu

    gegy schrieb:

    2.) Kann ich über den SelectHandler der Zelle mit einem "ColorPicker" die Farbe ändern und gleich ins Property zurückschreiben?
    Was für SelectedHandler?
    Was fürn ColorPicker?

    Ich kenne einen ColorDialog, den kann man öffnen, da kann man eine Farbe voreinstellen - zB den selectierten Farbwert - und die dort getroffene Auswahl kann man auch wieder in die Daten schreiben.
    Ein bischen kann man hier den Umgang damit sehen:
    Settings richtig verwenden + an Settings binden
    Dialoge benutzen ist einfach
    Hier färbe ich den Background mal ein.

    VB.NET-Quellcode

    1. Private Sub grvColors_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles grvColors.RowsAdded
    2. Debug.Print(e.RowIndex)
    3. If e.RowIndex = 1 Then
    4. For Each row As DataGridViewRow In grvColors.Rows
    5. For Each cell As DataGridViewCell In row.Cells
    6. If cell.OwningColumn.DataPropertyName = "Color" Then
    7. 'Dim colorValueList As New List(Of Integer)(Split(cell.Value, ","))
    8. Dim style As New DataGridViewCellStyle With {
    9. .BackColor = cell.Value
    10. }
    11. cell.Style = style
    12. End If
    13. Next
    14. Next
    15. End If
    16. Me.grvColors.ClearSelection()
    17. End Sub


    Mein Model besteht aus Instanzen einer Klasse:

    VB.NET-Quellcode

    1. Public Class MatProperty
    2. ColorOfMat As Color
    3. End Class


    VB.NET-Quellcode

    1. Dim modelList As New List(Of MaterialProperty)
    2. modelList.add(New Color.FromArgb(255, 0, 255, 0))
    3. ...


    Und dann einfach dem DataGridView Datasource die Liste zuweisen.
    Nun wird in der Spalte mit den Farben aber der Farbcode angezeigt.

    Mit SelectedHandler meinte ich das Event, welches beim selektieren einer Zelle ausgelöst wird.
    Sorry, ColorPicker war der falsche Begriff, natürlich ist der ColorDialog gemeint.

    Wenn noch immer nicht ganz klar ist was ich hier meine, könnte ich eventuell noch ein kleines Beispiel zusammenstellen.

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

    nee, das RowAdded ist nicht geeignet, die Zellen-Schrift verschwinden zu lassen. Das CellPaint wäre geeignet gewesen, oder das CellFormatting.

    VB.NET-Quellcode

    1. Private Sub grvColors_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles grvColors.CellFormatting
    2. If e.RowIndex = 1 Then
    3. Dim row = grvColors.Rows(e.RowIndex)
    4. For Each cell As DataGridViewCell In row.Cells
    5. If cell.OwningColumn.DataPropertyName = "Color" Then
    6. e.Value = "" : e.FormattingApplied = True
    7. End If
    8. Next
    9. End If
    10. End Sub
    Ok, ich hab das mal eingebaut, nun wird jedoch auch der Text in den anderen Spalten geleert.
    Ich habe vergessen zu erwähnen, dass meine Klasse nicht nur eine Eigenschaft Color hat, sondern noch div. andere Eigenschaften, welche ich in der Tabelle anzeige. (z.B. Name) Mit dem CellPaint Event werden die anderen Spalten auch geleert. Wenn ich deinen Code richtig interpretiere, geht er bei einer Zeile alle Zellen durch, wenn er dann die Spalte mit "Color" gefunden hat, formatiert er die aktuelle Zelle im Durchlauf. Das ist beim ersten Durchlauf die erste Zelle. Dann geht er das alles nochmal für die nächste Zelle der aktuellen Zeile durch. Sprich: Jede Zelle der Zeile wird mit einem Leeren String formatiert. Ich glaub da muss ich noch was umbauen. ;)

    Ich habs nun mal so hingetrickst:

    VB.NET-Quellcode

    1. ​Dim row = grvColors.Rows(e.RowIndex)
    2. Dim colorColumnIndex As Integer
    3. For i = 0 To row.Cells.Count - 1
    4. If row.Cells(i).OwningColumn.DataPropertyName = "Color" Then
    5. colorColumnIndex = i
    6. End If
    7. Next
    8. For Each cell As DataGridViewCell In row.Cells
    9. If e.ColumnIndex = colorColumnIndex Then
    10. e.Value = "" : e.FormattingApplied = True
    11. End If
    12. Next


    Funktioniert, ist aber keine wirklich befriedigende Lösung. Ich wollte es mit einem Lambda Ausdruck lösen, aber die DataGridViewCellCollection unterstützt kein FindIndex.
    Weiß wer eine schönere Lösung?

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

    gegy schrieb:

    Ok, ich hab das mal eingebaut, nun wird jedoch auch der Text in den anderen Spalten geleert.
    Dann haste wohl was anneres eingebaut als was ich postete.
    In meim Code werden nur die Spalten text-entleert, deren DataPropertyName "Color" lautet.

    Ich weiss aber auch nix mit deim Code anzufangen - in welcher Methode steht der denn?

    (Bei meim Code ist das klar, der zeigt ja eine ganze Methode.)
    Sorry, hab den Funktionskopf vergessen. So schaut das aus bei mir:

    VB.NET-Quellcode

    1. Private Sub grvColors_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles grvColors.CellFormatting
    2. Dim row = grvColors.Rows(e.RowIndex)
    3. Dim colorColumnIndex As Integer
    4. For i = 0 To row.Cells.Count - 1
    5. If row.Cells(i).OwningColumn.DataPropertyName = "Color" Then
    6. colorColumnIndex = i
    7. End If
    8. Next
    9. For Each cell As DataGridViewCell In row.Cells
    10. If e.ColumnIndex = colorColumnIndex Then
    11. e.Value = "" : e.FormattingApplied = True
    12. End If
    13. Next
    14. End Sub


    Mit deinem Code wurde jede Zelle in einer Zeile bei mir entleert. Ich bin es mal für eine Zeile schrittweise durchgegangen.
    ja, sorry - da habich so einigen Quatsch von dir abgeschrieben. Probierma

    VB.NET-Quellcode

    1. Private Sub grvColors_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles grvColors.CellFormatting
    2. If Not TypeOf grvColors.Rows(e.RowIndex).DataBoundItem Is DataRow Then Return ' Zufügezeile, Headerzeile aussortieren
    3. If grvColors.Columns(e.ColumnIndex).DataPropertyName <> "Color" Then Return ' nur bei "Color" weitermachen
    4. e.Value = "" : e.FormattingApplied = True
    5. End Sub

    Neu

    @gegy Fang an mit Option Strict On.
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    RodFromGermany schrieb:

    Fang an mit Option Strict On.


    Sorry, aber ich weiß nicht, wie mir dein Hinweis auf Option Stric hier helfen soll.
    es handelt sich hier um ein Beispiel und da ist die Typensicherheit wohl doch egal oder?

    Können wir bitte beim Thema bleiben?

    *Vollzitat entfernt* ~NoFear23m

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

    Neu

    naja, das wär schon eine Bemerkung wert gewesen, dass du garnet mit typDataset arbeitest, sondern Object-Databinding verwendest. Da kann ein Test auf DataRow ja niemals zutreffen. (naja naja - kanner sowieso nicht, bei Dataset-Binding wärens ja DataRowViews gewesen - egal also)
    Jdfs mit ObjectBinding an die model-Klasse gehts zB so:

    VB.NET-Quellcode

    1. Private Sub grvColors_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles grvColors.CellFormatting
    2. If Not TypeOf grvColors.Rows(e.RowIndex).DataBoundItem Is model Then Return ' Zufügezeile, Headerzeile aussortieren
    3. If grvColors.Columns(e.ColumnIndex).DataPropertyName <> "Color" Then Return ' nur bei "Color" weitermachen
    4. e.CellStyle.BackColor = DirectCast(e.Value, Color)
    5. e.Value = "" : e.FormattingApplied = True
    6. End Sub
    Deine DataGridView1_RowsAdded-Methode löschen.

    Neu

    gegy schrieb:

    wie mir dein Hinweis auf Option Stric hier helfen soll.
    Dir kann hier nicht qualifiziert geholfen werden, wenn Du Strict Off programmierst.
    Du musst zunächst nachweisen, dass Dein Code mit Strict On zunächst syntaktisch richtig ist, zum Nachweis, dass es daran nicht liegt, ansonsten wird abgewunken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!