ComboBox im DataGridView zur Laufzeit füllen

  • VB.NET

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

    ComboBox im DataGridView zur Laufzeit füllen

    Hallo erstmal.

    Ich hänge seit einigen Tagen an einem Problem wo ich einfach nicht weiterkomme.
    Hab viel per google gesucht, finde aber nichts was mir hilft da endlich den Durchblick zu bekommen.

    Also, ich habe mir ein typisiertes Dataset erstellt das so aufgebaut ist:

    Quellcode

    1. MyRecords (Table)
    2. ID (Int32)
    3. Type (String)
    4. Data (String)
    5. Collection (String)
    6. Picture (Byte())


    Und so füge ich eine Zeile hinzu.

    VB.NET-Quellcode

    1. Dim newRow As MyRecordsRow = Dts_MyData1.MyRecords.NewMyRecordsRow
    2. With newRow
    3. .ID = oList.Count
    4. .Type = sType
    5. .Data = sRecord
    6. .Collection = sCol
    7. End With
    8. Dts_MyData1.MyRecords.AddMyRecordsRow(newRow)


    Die Column "Collection" soll für die ComboBox herhalten und die Daten möchte ich von einer
    StringCollection beim erstellen einer Zeile übergeben. Wobei in jeder ComboBox andere Daten eingefügt
    werden sollen und die StringCollection nicht zur ganzen Laufzeit existiert.

    Was ich schon probiert habe, ist die Daten per .Datasource zu übergeben bzw. ein DataGridViewComboBoxCell zu füllen und dieses zu übergeben.
    Ich bekomme aber bei allen Versuchen die selbe Fehlermeldung.
    "DataGridViewComboBoxCell.Value is not valid"

    Mal abgesehen davon wie sich das lösen lässt, wäre es für mich eine große Hilfe wenn ihr mir sagen könntet ob meine Vorgehensweise beim erstellen der Zeilen in Ordnung ist, oder ob ich dies anders lösen sollte.

    Danke Euch, cane
    das Erstellen der Zeilen geht mit der anneren AddMcRecordsRow()-Überladung bisserl einfacher, aber sonst voll i.O - mal jemand, der von vornherein typisiert vorgeht :thumbsup:

    Eine Combobox füllst du imo am besten durch eine eigene DataTable. Ist ja kein Problem, du hast ja schon ein typDataset, da jetzt die Auswahlmöglichekietne der Combo ebenfalls als DataTalbe anlegen.
    gugge vier Views-Videos , speziell Film#3
    (zu AddRecordsRow() gugge Film#8)
    Hab mir schon gedacht, dass ich die Daten für die ComboBox wohl in einer eigenen Table speichern muß.
    Nur, wie sollte dann die Table aufgebaut sein, wenn für jede ComboBox andere Einträge vorkommen können und auch die Anzahl der Einträge unterschiedlich ist?

    Da ich keine bessere Idee habe würde ich nun für jede ComboBox zur Laufzeit eine eigene Table mit den Einträgen erstellen da ich die Einträge auch erst zur Laufzeit ermittle und nicht schon vorher weiß.
    Nur mein Gefühl sagt mir, dass wäre keine optimale Lösung oder?

    Werde mir mal die Videos genauer ansehen.

    Danke Dir.
    Ich krame jetzt nochmal diesen Thread raus, da ich es noch nicht ganz hinbekomme.
    Hab mir die tutorials angesehen und es funktioniert soweit auch alles. Thx an ErfinderDesRades.
    Also das speichern der Daten in den Tables wie es sein sollte.
    Und die Daten werden auch im DataGridView angezeigt, aber in der ComboBox im GridView werden nicht nur bestimmte Daten aus der zweiten Table angezeigt, sondern alle obwohl ich nur bestimmte will.

    Kleines Beispiel zu deinem (ErfinderDesRades) Demo Projektes "JoiningView".
    Bei den ComboBoxen "CategoryID" und "DelivererID" werden ebenfalls alle Daten aus der jeweiligen Table angezeigt und nicht nur z.B. die Lieferanten die diesen Artikel wirklich liefern können.

    In meinem Fall sieht das so aus.
    Ich habe eine Table deren Daten im GridView angezeigt werden sollen.

    Quellcode

    1. MyRecords (Table)
    2. ID (Int32)
    3. Type (String)
    4. Data (String)
    5. Picture (Byte())


    Und dann habe ich noch eine Table in der zusätzliche Strings gespeichert werden.

    Quellcode

    1. MyCollection (Table)
    2. ID (Int32)
    3. Data (String)
    4. RecordsID (Int32)

    Zwischen MyRecords.ID und MyCollection.RecordsID besteht eine Relation und jedem Eintrag in MyCollection wird die richtige ID aus MyRecords zugewiesen.
    Nun dachte ich eigentlich, dass in der ComboBox auch nur die Einträge aus MyCollection auftauchen würden, die die selbe ID aufweisen wie die angezeigte Zeile aus MyRecords.

    Wo genau liegt mein Denkfehler?
    Ist das nur eine Kleinigkeit oder geh ich das komplett falsch an?

    Danke Euch, cane :)

    Cane schrieb:

    aber in der ComboBox im GridView werden nicht nur bestimmte Daten aus der zweiten Table angezeigt, sondern alle obwohl ich nur bestimmte will.
    also die ComboboxColumn hat ja auch eine BindingSource als Datasource. und dieser BindingSource kann man auch einen Filter setzen.

    Aber eine ganz individuelle Auswahl ist so nicht hinzukriegen. Es ist eben die Datasource nicht der einzelnen Combo, sondern der ganzen ComboColumn. Also muss diese Datasource Alle werte enthalten, die im gesamten DGV in dieser Spalte auftreten können.
    Hättest du etwa einen Artikel, der per Combo auf Deliverer1 verweisen soll, aber der ComboColumn-BindingSource-Filter schließt Deliverer1 aus, so gibts eine DataException, weil der DGV-Wert nicht gültig ist, weil er in der Combo-Datasource nicht vorkommt.

    Ich hoffe, das ist so verständlich :/