Combobox in DataGridView mit unterschiedlichen Werten pro Zeile

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Combobox in DataGridView mit unterschiedlichen Werten pro Zeile

    Hallo miteinander

    ich möchte gerne in einem DataGridView in eine ComboBox einbauen. Die ComboBox hat aber in jeder Zeile andere Werte hinterlegt. Wie mache ich das?
    Code bis jetzt:


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim Show1 As New SearchResult With {.Title = "Archer"}
    4. Show1.Mirrors.Add(New Mirror With {.Hoster = "Hoster1", .URL = "http://hoster1/url"})
    5. Show1.Mirrors.Add(New Mirror With {.Hoster = "Hoster2", .URL = "http://hoster2/url"})
    6. Dim Show2 As New SearchResult With {.Title = "Simpsons"}
    7. Show2.Mirrors.Add(New Mirror With {.Hoster = "Hoster6", .URL = "http://hoster61/url"})
    8. Show2.Mirrors.Add(New Mirror With {.Hoster = "Hoster9", .URL = "http://hoster9/url"})
    9. Dim nSearchResults As New List(Of SearchResult)
    10. nSearchResults.Add(Show1)
    11. nSearchResults.Add(Show2)
    12. Dim dtSearchResults As New DataTable
    13. dtSearchResults.Columns.Add("Serientitel", GetType(String))
    14. dtSearchResults.Columns.Add("Mirrors", GetType(ComboBox))
    15. For Each nShow In nSearchResults
    16. dtSearchResults.Rows.Add(nShow.Title, ?????? ComboBox ??????)
    17. Next
    18. Dim bsSearchResults As New BindingSource With {.DataSource = dtSearchResults}
    19. DataGridView1.DataSource = bsSearchResults
    20. End Sub
    21. Public Class SearchResult
    22. Public Title As String
    23. Public Mirrors As New List(Of Mirror)
    24. End Class
    25. Public Class Mirror
    26. Public Hoster As String
    27. Public URL As String
    28. End Class
    29. End Class


    Ich bin mir nicht sicher, ob dtSearchResults.Columns.Add("Mirrors", GetType(ComboBox)) überhaupt richtig ist. Hier wird ja die DataTable definiert...

    Die ComboBox soll eigentlich nur den Hoster anzeigen, der Wert für URL sollte jedoch ebenfalls hinterlegt sein. Normalerweise würde ich solche ComboBoxen so füllen:

    VB.NET-Quellcode

    1. Dim nComboBox As New ComboBox
    2. Dim items As New Dictionary(Of String, String)
    3. For Each nMirror In nShow.Mirrors
    4. items.Add(nMirror.Hoster, nMirror.URL)
    5. Next
    6. nComboBox.DataSource = items.ToList
    7. nComboBox.DisplayMember = "Key"
    8. nComboBox.ValueMember = "Value"



    EDIT: DataGridView1 muss übrigens nicht unbedingt über eine BS an die Daten kommen, von mir aus kann man die Zeilen auch einfach manuell einfügen.

    ErfinderDesRades schrieb:

    wärest du daran interessiert, zu erlernen, wie man solch mit einem typisierten Dataset abhandelt?


    Ich sag mal "ja gerne" :)

    EDIT: also ich muss das nachher nicht in einer DB oder ähnlichem speichern. Grundsätzlich soll nur über die ComboBox ein Hoster ausgewählt und der Link in einem Browserfenster geöffnet werden (entweder beim Auswahl in der Combobox oder mittels dritter Button-Spalte nach Auswahl des Hosters).
    Ich möchte dann auch noch ein paar Filtermöglichkeiten einbauen, aber das sollte ja kein Problem sein. Natürlich sieht die "reelle" Verwendung etwas umfangreicher aus als das Beispiel oben, aber für das Verständniss sollte das reichen.

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

    Ersetze deine Datenklassen durch ein typisisertes Dataset, mit 2 typisierten DataTables darinnen.
    Auf vier Views-Videos ist im ersten Film gezeigt, wie das geht.
    Da kommen noch paar weitere Filme, in einem gehts dann auch darum, DatagridViewComboboxColumns in ein datengebundenes DGV einzufrickeln.
    "JoiningView" ist glaub der passendste Film zum Thema.

    Ups - sorry - ich hab was überlesen:

    DanCooper schrieb:

    Die ComboBox hat aber in jeder Zeile andere Werte hinterlegt.
    Das weiss ich nicht, wie das gehen soll.
    Kann man vmtl. auch zusammenhacken, indem man das Dgv_ShowEditingControl-Event behandelt, und da was listenreiches mit anstellt, aber das ist mir zu kompliziert, hier auseinanderzusetzen (und ich müsste mich selbst nochmal einarbeiten)

    Der JoiningView-Standardfall hinterlegt eine Lookup-Tabelle für die ganze DGV-Spalte, und die steht dann in jeder Zeile gleichermassen zur Auswahl.


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

    ErfinderDesRades schrieb:

    Ups - sorry - ich hab was überlesen:


    Jep, hab ich mir beim "überfliegen" deines Tuts gerade auch gedacht. Da würde ja ganz DB-klassisch eine Tabelle "Mirrors" als Quelle für die Combobox herhalten müssen, die es aber nicht gibt, zumindest keine gemeinsame für alle Serien-Rows.

    Ich denke ich löse das Link-Problem nun erstmal über ein Kontextmenü und füge die einzelnen Hosts als String.Join in eine String Column ein, bis mir was anders einfällt. So sieht man zumindest die Hoster, muss den Download aber über das Kontextmenü starten.