Datagridview - Inhalte einer Spalte ändern

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von MK_CGN.

    Datagridview - Inhalte einer Spalte ändern

    Hallo zusamen,
    ich habe nochmal eine Frage bezüglich meines Datagridview. Das Auslesen aus der Datenbank und Darstellung funktioniert wunderbar, auch mein vorheriges Thema mit dem Befehl Innerjoin, um 2 Tabellen zu verknüpfen.
    Ich habe allerdings eine ausgelesene Spalte mit dem Namen "Spalte Z". In der Spalte werden pro Datensatz allerdings nur Zahlen dargestellt, z. B. "1", "2,", etc.
    Jetzt würde ich auf Grund eines sinnvolleren Textes gerne die Inhalte der "Spalte Z" pro Datensatz anpassen, damit es für den User einen Sinn ergibt. Diese Werte sind allerdings nicht in der SQL DB hinterlegt.

    Habe schon mehrere Dinge ausprobiert, komme aber zu keinem Ergebnis.
    Vielleicht weiß hier jemand Rat.

    Viele Grüße
    Du schreibst das die Daten aus der Datenbank gelesen werden und im DataGridView angezeigt werden. Die besagte Spalte sei aber nicht in der Datenbank.
    Wo kommt die dann her?
    Oder ist die Spalte aus der Datenbank aber der Inhalt nicht?
    Wie kommen dann die Werte 1 und 2 dorthin?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ich vermute, dass du in der Spalte Z einfach einen Status hast... Oder so was. Wie ich es verstanden habe steht 1 für irgend was sowie 2 für irgend was usw...

    Nun ja, es gibt mehrere Möglichkeiten das zu lösen. Ich würde es mit einem Enum machen. Je nach dem wie du die Datenbank ausliest geht es einfacher oder schwerer.
    Angenommen du liest die Datenbank per Entity aus. Na dann einfach die Klasse erweitern und Enum reinbasteln mit einem Deskription. Das Deskription kannst du hinterher für den Benutzer anzeigen lassen.

    Eine weitere Möglichkeit wäre mit Binding und entweder mit einem Converter weiter machen, oder bei der Variablen direkt es so ungefähr ausgeben:

    ...
    get
    {
    if(wert == 1)
    return "blabla"
    else if(wert == 2)
    return "blalbalba"
    usw...
    }

    Wobei dein Wert ist der Wert der von der Spalte kommt. Er würde praktisch beim Abfragen automatisch drauf zugreifen und den Wert entsprechend auswerten...

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

    MK_CGN schrieb:

    Jetzt würde ich auf Grund eines sinnvolleren Textes gerne die Inhalte der "Spalte Z" pro Datensatz anpassen, damit es für den User einen Sinn ergibt.
    für sowas ist das DGV_CellFormatting - Event vorgesehen.
    Da kannst du den OriginalWert ersetzen durch etwas beliebiges anneres (sogar auch Icons), was für den Wert angezeigt werden soll.

    vlt. hilft Icons im DatagridView und das CellFormatting-Event
    @ErfinderDesRades

    Vielen Dank für die Hilfestellung. Allerdings komme ich an der Stelle nicht weiter.
    Ich habe jetzt folgenden Code implementiert, aber es wird immer noch der Ursprungswert aus der DB angezeigt und nicht der sinnvolle Name.

    Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If DataGridView1.Columns.Equals("Spalte_Z") Then
    3. If CType(e.Value, String) = "1" Then
    4. e.Value = "4711"
    5. End If
    6. If CType(e.Value, String) = "2" Then
    7. e.Value = "0815"
    8. End If
    9. End If
    10. End Sub


    Was mache ich falsch? Vielleicht kann nochmal jemand einen Anschubs geben. Danke
    =O Sorry habe ich nicht gesehen. Ich schaue es mir nun mal an. Danke für den Hinweis


    ... habe jetzt folgendes probiert:

    Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs)
    2. _Handles DataGridView1.CellFormatting
    3. If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Spalte Z" Then
    4. If e.Value IsNot Nothing Then
    5. Dim stringValue As String = CType(e.Value, String)
    6. stringValue = stringValue.ToLower()
    7. If ((stringValue.IndexOf("1") > -1)) Then
    8. e.Value = "4711"
    9. End If
    10. If ((stringValue.IndexOf("2") > -1)) Then
    11. e.Value = "0815"
    12. End If
    13. End If
    14. End If
    15. End Sub

    Aber trotzdem funktioniert es nicht.
    Es werden immer noch die Werte aus der DB angezeigt.

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

    Das hier

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If DataGridView1.Columns.Equals("Spalte_Z") Then
    3. If CType(e.Value, String) = "1" Then
    4. e.Value = "4711"
    5. End If
    6. If CType(e.Value, String) = "2" Then
    7. e.Value = "0815"
    8. End If
    9. End If
    10. End Sub
    ist ja Müll.
    Die Bedingung DataGridView1.Columns.Equals("Spalte_Z") kann ja niemals erfüllt werden.
    Welchen Datentyp hat DataGridView1.Columns, und welchen hat "Spalte_Z", und wie soll das jemals das gleiche sein?



    Dein letztes Snippet kann ich nicht lesen (bzw mache mir nicht die Mühe), weil das Layout ist total zerschossen.
    Du solltest aber mit dem vorigen Snippet weitermachen, und eine sinnvolle Bedingung aufstellen.
    Versuch mal das hier

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If DataGridView1.Columns(e.ColumnIndex).Name.Equals("Spalte_Z") Then
    3. If CType(e.Value, String) = "1" Then
    4. e.Value = "4711"
    5. End If
    6. If CType(e.Value, String) = "2" Then
    7. e.Value = "0815"
    8. End If
    9. End If
    10. End Sub


    LG
    Besser so:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If DataGridView1.Columns(e.ColumnIndex).Name <> "Spalte_Z" Then Return
    3. Select Case CType(e.Value, String)
    4. Case "1" : e.Value = "4711"
    5. Case "2" : e.Value = "0815"
    6. Case Else : e.Value = "unexpected Value"
    7. End Select
    8. End Sub

    Wenn "1" zutrifft muss auf "2" ja nicht mehr getestet werden.
    Weiters ist der Code so etwas leichter lesbar, weil weniger verschachtelt .
    Und auch der Fall, dass nix zutrifft wird behandelt.

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

    Schade das hier doch schon die Lösung gepostet wurde. Vermutlich setzt sich der TE nun nicht mehr mit den Datentypen auseinander, was sich später wieder rächt.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo zusammen,
    vielen Dank für Eure Hilfe.

    @ErfinderDesRades: Ich habe jetzt Deinen Code an meine Gegebenheiten mit den richtigen Werten und Spaltenname angepasst.
    Aber es funktioniert leider nicht, dass der value geändert wird.

    Nochmal zum Verständnis.
    Ich habe eine Textbox in der ich einen Namen eingeben kann, z. B. "Meier". Dann klicke ich auf einen Button und es wird in der DB nach den Einträgen Meier gesucht und im Datagridview dargestellt.
    In den abgerufenen Daten gibt es dann die Spalte_Z mit den anzupassenden Inhalten.

    Muss ich noch an einer anderen Code Stelle eine Änderung vornehmen, damit die "

    Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    " funktioniert?
    Du musst vlt. diese Kopf-Zeile der Funktion an dein DGV anpassen - heisst das DGV wirklich Datagridview1? (das wäre sehr schlechter Stil)

    Oder setze zunächstmal einen Haltepunkt auf genannte Kopf-zeile und vergewissere dich im Einzelschritt, ob die Methode aufgerufen wird, und was sie tatsächlich macht.

    Wenn du Haltepunkt nicht kennst, gugge hier ein paar Grundlagen: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    MK_CGN schrieb:

    das Datagridview heißt natürlich nicht datagridview1 und der Name ist angepasst.
    denn eine Bitte: Poste nicht iwelchen Phantasie-Code, der so garnet existiert.
    Kopiere genau deinen Code aus, wie er bei dir in Betrieb ist.
    Sonst fangen wir ganz schnell an über Sachen zu reden, dies nicht gibt, und können die Probleme, die es gibt, nicht sehen, und kommen natürlich auch keine vernünftigen Vorschläge bei raus, die du dann aber vlt. ausprobierst, und deinen Code erst recht kaputt machst, und uns danach womöglich noch anneren Code servierst usw...
    Werde ich für die Zukunft beherzigen.

    Habe jetzt einen Haltepunkt in der besagten Zeile

    Quellcode

    1. Private Sub DGV_Datenbankabfrage_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DGV_Datenbankabfrage.CellFormatting

    eingefügt und im Einzelschritt Modus das Debugging vorgenommen.
    Der Code wird auch bis zum Haltepunkt durchgearbeitet.

    Ich erkenne nun aber leider nicht (Asche auf mein Haupt) wo ich erkennen kann welchen Code er da ausführt...

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