Problem mit DataGridViewComboBoxCell in Verbindung mit DataSource

  • VB.NET
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von DerBrain.

    Problem mit DataGridViewComboBoxCell in Verbindung mit DataSource

    Hallo zusammen,
    Ich habe Daten welche ich auf mehrere Tabellenblätter in Excel verteilen möchte.
    Es gibt Tabellenblätter mit festen Namen sowie Sheets die der Benutzer individuell benennen kann.
    Damit der Benutzer die Namen setzen kann, habe ich auf einem Formular eine Listbox erstellt.
    In einerm DataGridView sollen (ein Teil) der Daten dargestellt werden, damit der Benutzer entscheiden kann, welche Daten auf welches Tabellenblatt sollen.
    Dafür habe ich dem DGV 3 Spalten gegeben, Column1 enthält die Nummer, Column2 die Zeile und Column3 (als DataGridViewComboBoxColumn) das Ziel-Tabellenblatt.
    Da die Listbox sowie die ComboBoxColumn die gleiche Daten enthalten sollen, habe ich hierfür eine BindingList(of String) erstellt.
    Hier meine (etwas reduzierte) Form:

    und der entsprechende Quellcode:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private mItems As New BindingList(Of String)
    3. Public Sub New()
    4. ' Dieser Aufruf ist für den Designer erforderlich.
    5. InitializeComponent()
    6. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    7. mItems.Add("Daten")
    8. mItems.Add("Infos")
    9. ListBox1.DataSource = mItems
    10. Column3.DataSource = mItems
    11. Dim data = LeseExcel()
    12. For i = 0 To data.GetLength(0) - 1
    13. If data(i, 0) IsNot Nothing Then
    14. DataGridView1.Rows.Add(data(i, 0), i, "Daten")
    15. End If
    16. Next
    17. End Sub
    18. Private Function LeseExcel() As Object(,)
    19. ' Erzeugt fiktive Daten, welche in das DataGridView sollen
    20. ' Originale Daten stammen aus einer Exceldatei
    21. Dim data(99, 3) As Object
    22. Dim count As Integer = 0
    23. Dim zufallszahl As New Random
    24. For i = 0 To 99
    25. If zufallszahl.Next(1, 5) = 1 Then
    26. count += 1
    27. data(i, 0) = count
    28. End If
    29. data(i, 1) = zufallszahl.Next(0, 10)
    30. data(i, 2) = zufallszahl.Next(0, 10)
    31. data(i, 3) = zufallszahl.Next(0, 10)
    32. Next
    33. Return data
    34. End Function
    35. Private Sub Button_Add_Click(sender As Object, e As EventArgs) Handles Button_Add.Click
    36. If Not mItems.Contains(TextBox1.Text) Then
    37. mItems.Add(TextBox1.Text)
    38. End If
    39. End Sub
    40. End Class


    Nun mein Problem:
    Wähle ich in einer der Comboboxen einen Eintrag der hardcoded in der Liste steht funktioniert alles einwandfrei. (Hier 'Daten' oder 'Infos')
    Füge ich über den Button einen neuen Eintrag hinzu, wird mir der neue Eintrag in der Listbox als auch in der Auswahl jeder Combobox dargestellt.
    Wähle ich selbigen nun jedoch in einer der Combobxen aus, kommt folgende Fehlermeldung:


    Es ist mir ein Rätsel, warum das DGV die neuen Daten der Liste zwar als Auswahl anzeigt, diese aber nicht als gültig erkennt :(
    Meine Wunschlösung wäre an einer Zeile im Code ein Update oder änliches aufzurufen, damit diese Werte ebenfalls als gültig akzeptiert werden.

    Ich habe in Foren gelesen, dass ein DataSet mit 2 Tabellen (Items für die Comboboxen und Daten für das DGV) inkl. Abhängigkeit zueinander abhilfe schaffen kann.
    In dem finalen Programm muss die Reihenfolge der Tabellenblätter ebenfalls durch den Benutzer konfiguriert werden.
    Dies sorgte recht schnell dazu, dass ich diesen Ansatz wieder fallen ließ, da ich keine Möglichkeit sah, der ListBox mitzuteilen, wie sie die Daten der Tabelle Items zu sortieren hat...

    Ich hoffe ihr konnt mir weiter helfen...
    Gruß DerBrain87

    *EXE-Anhang entfernt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich habe keinen funktionierenden BindingReset-Befehl gefunden, aber damit klappt es:

    VB.NET-Quellcode

    1. Private Sub Button_Add_Click(sender As Object, e As EventArgs) Handles Button_Add.Click
    2. If Not mItems.Contains(TextBox1.Text) Then
    3. mItems.Add(TextBox1.Text)
    4. Column3.DataSource = Nothing
    5. Column3.DataSource = mItems
    6. End If
    7. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.