Der DataGridViewComboBoxCell-Wert ist ungültig

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

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

    Der DataGridViewComboBoxCell-Wert ist ungültig

    Mit dem folgenden Quelltext bezwecke ich ein Datagridview dessen Spalte (2) eine ComboBox Spalte ist an eine existierende Instanz einer eigenen Klasse Zu binden. Dabei ist:

    KDHauptfenster die Inztanz der besagten Klasse
    TelNrN eine Eigenschaft dieser Klasse vom Typ ListOf(ClassTelNr)
    ClassTelNr ist wiederum eine eigene Klasse die eine Eigenschaft Typ hat der vom Datentyp ein Enum (TelNrTyp) ist.

    Die Vorgehensweise benutze ich seit Jahren in etlichen Programmen. Das einzige was hier für mich neu ist, ist die ComboBox Spalte, weswegen ich AutoGenerateColumns = False gesetzt habe und die Spalte jeweils selbst anlege.

    Auch die Vorgehensweise einzelne ComboBoxen mit Werten von Enums zu füllen und an Eigenschaften von Klassen zu binden verwende ich so häufig. Im Debugger kann ich auch sehen, dass das CellTemplate Drop sauber mit den Werten befüllt ist.

    In diesem Fall hagelt es Zur Laufzeit aber Fehlermeldungen, "Der DataGridViewComboBoxCell-Wert ist Ungültig" - Irgendwas scheint also bei der Bindung nicht zu stimmen. Mit einer Normalen TextBoxSpalte lässt sich übrigens wunderbar binden.

    Wo also hat sich der Fehler eingeschlichen?

    VB.NET-Quellcode

    1. Dim Drop As New DataGridViewComboBoxCell()
    2. Drop.Items.AddRange(System.Enum.GetValues(GetType(TelNrTyp)))
    3. DataGridViewTelNrN.AutoGenerateColumns = False
    4. DataGridViewTelNrN.DataSource = KDHauptfenster.TelNrN
    5. DataGridViewTelNrN.Columns.Add(New DataGridViewTextBoxColumn)
    6. DataGridViewTelNrN.Columns.Item(0).HeaderText = "ID"
    7. DataGridViewTelNrN.Columns.Item(0).DataPropertyName = "ID"
    8. DataGridViewTelNrN.Columns.Item(0).ToolTipText = ""
    9. DataGridViewTelNrN.Columns.Item(0).Visible = False
    10. DataGridViewTelNrN.Columns.Add(New DataGridViewTextBoxColumn)
    11. DataGridViewTelNrN.Columns.Item(1).HeaderText = "KDNr"
    12. DataGridViewTelNrN.Columns.Item(1).DataPropertyName = "KDNr"
    13. DataGridViewTelNrN.Columns.Item(1).ToolTipText = "Referenz KdNr"
    14. DataGridViewTelNrN.Columns.Item(1).Visible = False
    15. DataGridViewTelNrN.Columns.Add(New DataGridViewComboBoxColumn)
    16. DataGridViewTelNrN.Columns.Item(2).CellTemplate = Drop
    17. DataGridViewTelNrN.Columns.Item(2).DataPropertyName = "Typ"
    18. DataGridViewTelNrN.Columns.Item(2).ToolTipText = "Art des Eintrages"
    19. DataGridViewTelNrN.Columns.Item(2).HeaderText = "Typ"
    20. DataGridViewTelNrN.Columns.Item(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    21. DataGridViewTelNrN.Columns.Item(2).Visible = True
    22. DataGridViewTelNrN.Columns.Item(2).ReadOnly = False
    23. DataGridViewTelNrN.Columns.Add(New DataGridViewTextBoxColumn)
    24. DataGridViewTelNrN.Columns.Item(3).DataPropertyName = "TelNr"
    25. DataGridViewTelNrN.Columns.Item(3).ToolTipText = "Die Telefonnummer oder E-Mail Adresse"
    26. DataGridViewTelNrN.Columns.Item(3).HeaderText = "TelNr / E-Mail"
    27. DataGridViewTelNrN.Columns.Item(3).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells 'TelNr E-Mail
    28. DataGridViewTelNrN.Columns.Item(3).Visible = True
    29. DataGridViewTelNrN.Columns.Item(3).ReadOnly = False
    30. ...
    Auch wenn es die Frage nicht beantwortet: Ein Binding über Designer und BindingSource kommt nicht infrage?
    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.
    probierma des

    VB.NET-Quellcode

    1. Imports System.Data
    2. Public Class frmdgvEnums
    3. Public Sub New()
    4. InitializeComponent()
    5. End Sub
    6. Private Sub frmdgvEnums_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Dim dockStyles = DirectCast(System.Enum.GetValues(GetType(DockStyle)), DockStyle())
    8. Dim datas = dockStyles.Select(Function(x) New ClassTelNr With {.Nr = $"040 11{CInt(x)}", .TelTyp = x})
    9. bsTelefon.DataSource = GetType(ClassTelNr)
    10. DataGridViewTelNrN.Columns.Add(New DataGridViewTextBoxColumn With {.DataPropertyName = "Nr"})
    11. Dim col = New DataGridViewComboBoxColumn With {.DataPropertyName = "TelTyp", .DataSource = dockStyles}
    12. DataGridViewTelNrN.Columns.Add(col)
    13. bsTelefon.DataSource = datas
    14. End Sub
    15. End Class
    16. Public Class ClassTelNr
    17. Public Property TelTyp As DockStyle
    18. Public Property Nr As String
    19. End Class



    ups! - ist mit BindingSource
    Dateien
    • dgvEnums00.zip

      (216,74 kB, 32 mal heruntergeladen, zuletzt: )
    Danke erstmal,

    @ErfinderDesRades

    wenn ich Deine Antwort richtig verstehe, liegt der Kern in den Zeilen 9, 14 und 15 ich werde das ausprobieren.
    Ob mit BindingSource dazwischen oder nicht, macht nach meiner Erfahrung beim DataGridView keinen Unterschied. Ich habe aber schon beides ausprobiert, beides führt zu dem gleichen Fehler.

    P.S. inzwischen habe ich den Vorschlag mit "DirecCast' getestet.

    Bei Mir sieht das dann so aus:

    VB.NET-Quellcode

    1. ​Drop.Items.AddRange(DirectCast(System.Enum.GetValues(GetType(TelNrTyp)), TelNrTyp()))


    Das bringt nichts. Allerdings ist mir auch nicht ganz klar warum eine Konvertierung des Typs von TelNrNyp nach TelNrTyp einen Effekt haben soll. Oder habe ich Deinen Ansatz total falsch verstanden.

    @VaporiZed

    Da KDHauptfenster ja erst zur Laufzeit Instanziiert wird, ist mir nicht ganz klar wie das gehen soll. Aber ich lerne immer gerne dazu.

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

    Da man mit sowas wie DataGridViewTelNrN.DataSource = KDHauptfenster.TelNrN nicht arbeiten sollte, käme an der Stelle stattdessen DataGridViewTelNrN.DataSource = GetType(ClassTelNr)
    Dann weiß die BindingSource und somit das DGV, was später angezeigt werden soll. Zur Laufzeit wird dann eine Ansammlung von ClassTelNr-Instanzen als BindingSource-DataSource gesetzt und die entsprechenden Daten werden korrekt angezeigt.
    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.

    modellflugwelt schrieb:

    Das bringt nichts. Allerdings ist mir auch nicht ganz klar warum eine Konvertierung des Typs von TelNrNyp nach TelNrTyp einen Effekt haben soll.
    Bitte nochma hingucken: Es ist eine Konvertierung von Object() nach DockStyle()

    Das hat den Effekt, weil von TelNrTyp() kann ich in der nächsten Zeile die Elemente an die Property ClassTelNr.TelTyp zuweisen.
    Mit Object wäre das nicht gegangen, weil ein Object ist kein DockStyle