Combobox in Datagridview

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Combobox in Datagridview

    Hallo Communitiy

    Ich fülle über ein nicht an eine Datenbank gebundene Abfrage ein Datagrid mit Daten. In manchen Spalten habe ich Zahlwerte wie z.B. 3,4,5 als mögliche Werte. Jeder dieser Werte steht für z.B. für einen Paketdienst (3=DHL, 4=GLS usw).
    Kann ich eine Spalte so verändern, das ich dort ein Combobox-Element zur Auswahl habe, das automatisch beim Befüllen des Grids auf den übergebenen Wert springt? Ich habe nur etwas gefunden, wie ich eine weitere Spalte mit einer Combobox hinten anhänge, aber nicht, wie ich eine vorhandene Spalte entsprechend ändern kann.

    VB.NET-Quellcode

    1. Dim sql As String
    2. Dim da As MySqlDataAdapter ' Macht die Anpassung (Adaptierung) zwischen Datenbank und DataTable
    3. Dim dt As New DataTable ' DataTable enthält die via DataAdapter angepassten Daten der Datenbank
    4. Dim ds As New DataSet ' DataSet faßt eine oder mehrere DataTable zu einem Set (Gruppe) zusammen
    5. Dim con As DbConnection = New MySqlConnection("server=192.168.0.3;uid=root;pwd=;database=Datenbank;Convert Zero Datetime=True")
    6. Dim cmd As New MySqlCommand
    7. sql = "Select Rec_id, Quelle, Kun_Name1, VRENUM, RDatum, Liefart, Zahlart, NSumme, MSumme, BSumme, Trackingcode, Stadium from Journal where Kun_Num = " & Me.DataGridView1.Rows(Me.DataGridView1.CurrentRow.Index).Cells(1).Value & " and Quelle in (3,4)"
    8. Try
    9. Cursor.Current = Cursors.WaitCursor
    10. da = New MySqlDataAdapter(sql, con)
    11. dt.TableName = "bestellungen"
    12. da.Fill(ds, dt.TableName)
    13. DataGridView2.DataSource = ds.Tables(dt.TableName)
    14. ds.Dispose()
    15. dt.Dispose()
    16. da.Dispose()
    17. DataGridView2.Columns(0).Width = 0 'Rec_ID
    18. DataGridView2.AutoResizeColumn(1)
    19. DataGridView2.AutoResizeColumn(2)
    20. DataGridView2.AutoResizeColumn(3)
    21. 'Hier wird die Combobox erstellt
    22. Dim cmb As New DataGridViewComboBoxColumn()
    23. cmb.HeaderText = "Select Data"
    24. cmb.Name = "cmb"
    25. cmb.MaxDropDownItems = 4
    26. cmb.Items.Add("True")
    27. cmb.Items.Add("False")
    28. DataGridView1.Columns.Add(cmb) 'Hier wird die Combobox hinzugefügt, aber leider am Ende
    29. DataGridView2.Columns(2).CellType = cmb 'Das hier geht leider nicht, da die CellType-Eigenschaft ReadOnly ist. Das wäre mein Ansatz gewesen.
    30. Catch ex As Exception
    31. MsgBox(ex.Message)
    32. End Try
    33. Cursor.Current = Cursors.Default
    34. con.Dispose()
    35. cmd.Dispose()
    @Superuse Jou, Du kannst Dir eine DataGridViewComboBoxColumn selber machen und damit arbeiten:
    stackoverflow.com/questions/26…wcomboboxcolumn-in-vb-net
    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!
    @Superuse Das ist korrekt.
    Du kannst nicht ein aktives Control in ein anderes Control konvertieren.
    Du musst das neue Control Deinem Projekt hinzufügen, dieses neu compilieren und starten und dann das DGV neu mit Daten befüllen.
    Oder habe ich Dein Anliegen falsch verstanden?
    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!
    Ich habe es mal in einem Screenshot verdeutlicht. In den rot markierten Feldern würde ich gerne andere Werte stehen haben. Leider lassen sich diese Werte nicht alle durch einen Join auflösen und durch den
    entsprechenden Text-Gegenwert ersetzen. Das ist in der Warenwirtschaft leider etwas komisch gelöst. Meine alternative wäre es eben gewesen, dort in die Spalten eine Combobox einzubasteln, die bei der Befüllung
    abhängig vom Zahlwert stattdessen den Text anzeigt. Unter VB6 konnte ich das mit einem komerziellen Grid ohne weiteres machen...
    Bilder
    • screen.jpg

      17,28 kB, 784×123, 17 mal angesehen
    @Superuse OK.
    Da habe ich nicht die große Ahnung davon, mir schwebt was vor mit DisplayMember und ValueMember der DataSource.
    Vielleicht kann Dir da der @ErfinderDesRades weiterhelfen.
    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!
    Die DGV-ComboBoxColumn braucht dazu eine DataSource, also die Daten, in denen Deine Paketdienste drinstehen. Wenn Du dann bei Displaymember den Paketdienstnamen einstellst und bei Valuemember Deine Dienst-ID, sollte es klappen. Man wählt dann quasi eine ID im Hintergrund aus, aber gezeigt wird die ganze Zeit der Dienst-Name. So wie gewünscht. Die Spalte an sich ist ja an eine Zeilen/Tabellen-Property gebunden. Und die hat dann Einfluss auf den Valuemember.
    Beispiel: Du hast in Deiner Tabelle:
    Paketanzahl, Lieferzeitpunkt, Dienstleister-ID
    Dann würde konkret in einer Zeile stehen: 4, 11:45 Uhr, 3
    Wenn Du nun die 3. Spalte zu einer ComboBoxColumn machst, die DataSource auf die Paketdienstleistertabelle stellst, den Valuemember auf Dienstleister-ID und Displaymember auf Name, dann wird die 3 automatisch in den Namen des Dienstleisters mit der ID=3 "umgewandelt" (ok, es erfolgt eigentlich nur eine alternative Anzeige)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    imo hat das keinen Sinn, so mit Daten zu arbeiten.
    Designe deine Datenbank nach den Regeln relationaler Datenmodelle, Generier dir daraus ein typisiertes Dataset und verwende Databinding.
    Wenn dir das alles nichts sagt, versuche es nicht trotzdem und auf andere Weise.
    Sondern lerne, wie's geht.

    Der einfachste Weg, es zu lernen, ist, erstmal die Datenbank wegzulassen. Bist du dazu bereit?

    Superuse schrieb:

    da das eine Warenwirtschaft ist
    Mit den hier von Dir gegebenen Statements kann ich Dir eigentlich nur raten:
    Finger weg, bevor etwas kaputt geht.
    Sag Deinem Chef, dass Du noch nicht so weit bist.
    Sag ihm, dass die arroganten Affen aus dem Forum Dir nicht helfen, die gute Applikation kaputt-zu-editieren :!:
    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!

    Superuse schrieb:

    mit VB6 ging das auch wie gewüscht
    Dann empfiehlt es sich, dies als Statement in den Eröffnungspost reinzuschreiben.
    Da bekommst Du hier Hilfe, die Deinem Problem besser angepasst ist.
    Eine Konvertierung von VB6 nach VB.NET ist eben nicht immer Q&D zu machen.
    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:

    imo hat das keinen Sinn, so mit Daten zu arbeiten.
    Designe deine Datenbank nach den Regeln relationaler Datenmodelle, Generier dir daraus ein typisiertes Dataset und verwende Databinding.
    Wenn dir das alles nichts sagt, versuche es nicht trotzdem und auf andere Weise.
    Sondern lerne, wie's geht.

    Der einfachste Weg, es zu lernen, ist, erstmal die Datenbank wegzulassen. Bist du dazu bereit?

    Superuse schrieb:

    Ich habe die Datenbank nicht designed und kann das auch nicht ändern, da das eine Warenwirtschaft ist. Ich hole mir dort nur die Daten um dort zusätzliche Funktionen mit externen Programmen zu bauen

    Also eher nicht.
    Nächstes Angebot: Bist du denn bereit, zumindest solange ohne eine Datenbank zu programmieren, bis du gelernt hast, wie man mittels typdataset und Databinding ComboboxColumns in Datagridviews zaubert?
    Danach kannste dann ja zusehen, wie du das typDataset aus deiner WaWi-DB befüllst.