Mehr als eine Combobox in Datagridview

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von frankseipferd.

    Mehr als eine Combobox in Datagridview

    Hallo zusammen,

    ich erzeuge per VB-Code eine Datagridview beim Laden eines Formulars.

    Diese ist an eine Datatable gebunden und zeigt auch schön die darin enthaltenen Felder an.

    Ich habe es geschafft, das Feld UmsatzartID in eine Combobox umzuwandeln, was auch funktioniert.

    Der Versuch, das Feld WaehrungID ebenfalls in eine Combobox umzuwandeln (s. auskommentierter Code am Ende) funktioniert leider nicht und es wird nach wie vor als normales Textfeld in der DGV angezeigt.

    Hat jemand eine Idee, weshalb das so ist?

    ' DataGridView einbinden
    Controls.Add(objDataGridView)

    ' DataGridView konfigurieren
    With objDataGridView
    .Dock = DockStyle.Fill
    .AllowUserToAddRows = True
    .RowHeadersVisible = True
    .AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells
    .DataSource = objDataTable
    .Columns("Satznummer").ReadOnly = True
    .Columns("UmsatzbasisID").Visible = False
    .Columns("Rechnungsdatum").Visible = False

    ' UmsatzartID durch Combobox ersetzen
    strSqlString = "Select * from tblUmsatzarten"
    objDataAdapter2 = New SqlDataAdapter(strSqlString, pblstrConnectionString)
    objDataAdapter2.Fill(objDataTable2)
    Dim cboUmsatzartID As New DataGridViewComboBoxColumn
    With cboUmsatzartID
    .DataPropertyName = "UmsatzartID"
    .HeaderText = "Umsatzart"
    .DataSource = objDataTable2
    .ValueMember = "UmsatzartID"
    .DisplayMember = "Umsatzart"
    End With
    ' Combobox in DGV einfügen
    .Columns.Remove("UmsatzartID")
    objDataGridView.Columns.Insert(5, cboUmsatzartID)

    ' ' WaehrungID durch Combobox ersetzen
    ' strSqlString = "Select * from tblWaehrungen"
    ' objDataAdapter3 = New SqlDataAdapter(strSqlString, pblstrConnectionString)
    ' objDataAdapter3.Fill(objDataTable3)
    ' Dim cboWaehrungID As New DataGridViewComboBoxColumn
    ' With cboWaehrungID
    ' .DataPropertyName = "WaehrungID"
    ' .HeaderText = "Währung"
    ' .DataSource = objDataTable3
    ' .ValueMember = "WaehrungID"
    ' .DisplayMember = "Währung"
    ' End With
    ' ComboBox in DGV einfügen
    ' .Columns.Remove("WaehrungID")
    ' objDataGridView.Columns.Insert(9, cboWaehrungID)
    End With

    Danke und Grüße
    Frank
    Mein Tipp: Lerne, sowas im Form-Designer zu machen, auf vier Views-Videos gibts auch dazu Erklärungen, BeispielCode, Filmle.

    Databinding-getriebene Entwicklung ist allerdings ein "Gesamtkunstwerk" und mit untypisierten Datasets kaum hinzukriegen. Aber das verlinkte Tut ist lang, und iwo ist da bestimmt auf weitere Tuts verlinkt, wo man sich (im Fehle-Fall) auch die Vorraussetzungen abholen kann.

    (Edit: Mist! - ich komm heut immer eins zu spät! :cursing: )
    So nun habe ich das DGV mit dem Designer erstellt.

    Jetzt ist es so, dass ich die beiden Felder UmsatzartID und WaehrungID per Assistent als ComboBox hinzugefügt habe.

    Das Feld UmsatzID funktioniert korrekt wie es soll, beim Feld Waehrung bekomme ich folgende Meldung beim Laden der DataGridView bzw. öffnen der Form:
    DataGridView-Ausnahme: System.ArgumentException: DataGridViewComboBoxCell-Wert ist ungültig.
    Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.

    Der DataProbertyName und das ValueMember sind bei beiden Feldern vom selben Datentyp (integer).

    Hier der Code für die UmsatzartID welches funktioniert:
    Me.cboUmsatzartID.DataPropertyName = "UmsatzartID"
    Me.cboUmsatzartID.DataSource = Me.ObjDataSet
    Me.cboUmsatzartID.DisplayMember = "tblUmsatzarten.Umsatzart"
    Me.cboUmsatzartID.HeaderText = "Umsatzart"
    Me.cboUmsatzartID.Name = "cboUmsatzartID"
    Me.cboUmsatzartID.ValueMember = "tblUmsatzarten.UmsatzartID"

    Und hier zum Vergleich der Code für die WaehrungID, welches den obigen Fehler bringt:
    Me.cboWaehrungID.DataPropertyName = "WaehrungID"
    Me.cboWaehrungID.DataSource = Me.ObjDataSet
    Me.cboWaehrungID.DisplayMember = "tblWaehrungen.Waehrung"
    Me.cboWaehrungID.HeaderText = "Waehrung"
    Me.cboWaehrungID.Name = "cboWaehrungID"
    Me.cboWaehrungID.ValueMember = "tblWaehrungen.WaehrungID"

    Kennt jemand diese Problematik?

    frankseipferd schrieb:

    Kennt jemand diese Problematik?

    ja, du hast das Video-Tut nicht genau befolgt :P
    Weil im Tut werden die Combos an BindingSources gebunden, du aber bindest an ein Dataset.

    Aber kann auch sein, das ist nicht das Problem. Problem kann sein, dass die Tabellen beim Einlesen des Datasets in ungünstiger Reihenfolge eingelesen werden. Das solltest du als erstes testen.
    NÄmlich, indem du die nervige Messagebox einfach immer wieder wegklickst (oder Esc-Taste), irgendwann sind dann doch alle Datensätze glücklich geladen, und wenn deine Art zu binden prinzipiell funktioniert, sollte es dann funktionieren.
    Wenn auch nach 300 mal Esc drücken immer noch Fehlermeldungen kommen, liegts an was anderem (oder du hast bereits über 300 Datensätze).
    Welches Video ist es denn genau? Da gibts so viele auf der Seite :)

    Also das mit ESC wegklicken funktioniert schon mal leider nicht... der Fehler kommt bei jedem Bearbeitungsschritt wieder :(

    Was ich halt nicht verstehe ist, weshalb es bei dem einen Feld einwandfrei funktioniert  ?( 

    frankseipferd schrieb:

    der Fehler kommt bei jedem Bearbeitungsschritt wieder
    Tja, dann wird wohl einfach stimmen, was da steht: Die comboboxCell enthält einen Wert, der in ihrer DataSource garnet vorkommt.

    Im VideoTut gehts beim "m:n-View" um ComboboxDatagridViewColumns.
    Oder auch im "JoiningView".

    (Aber glaub alle Vids anzugugge schadet auch nicht - in jedem wird iwas enthalten sein, was dir neu und nützlich sein mag.)