ComboBox - DataGridView mit DataTable

  • VB.NET

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

    ComboBox - DataGridView mit DataTable

    Hallo Zusammen,

    ich habe ein Datagridview in Verbindung mit einem DataTable. Nun möchte ich gerne in das DataGridView eine Spalte mit einer ComboBox einfügen, jedoch soll auch die freie Eingabe von Text möglich sein. Ist das so überhaupt möglich? Und wenn ja wie muss das umgesetzt werden?

    Ich habe mir das so vorgestellt, dass ich über ein zweites Formular über eine Listbox die ComboBox-Einträge verwalte.

    Doch wie bringe ich die ComboBox ins DataGridView in Verbindung mit dem DataTable?
    Hallo,
    zunächst einmal ja, das ist möglich aber ein bisschen tricky. Du implementierst die Spalte als

    VB.NET-Quellcode

    1. .Columns.Add(New DataGridViewComboBoxColumn With {.Name = "Beispiel", .DataSource = Itemliste, .ValueMember = "Value", .DisplayMember = "Value", .DefaultHeaderCellType = Type.GetType("DataGridViewComboBoxEditingControl")})


    Die Itemliste enthält die Strings, die im Dropdown angezeigt werden sollen. Am einfachsten vom Type List(of KeyValuePair(of Integer, String)), andernfalls musst du gegebenenfalls Valuemember oder Displaymember anpassen. (Und ja, ich benutze an dieser Stelle bewusst kein Dictionary, weil Dictionary und Lambda = Nix gut)
    Und dann musst du noch folgendes Eventhandling implementieren:

    VB.NET-Quellcode

    1. Private Sub dgv_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles Dgv.EditingControlShowing
    2. If e.Control.GetType.Name = "DataGridViewComboBoxEditingControl" Then
    3. Dim ctrl As DataGridViewComboBoxEditingControl = e.Control
    4. If ctrl IsNot Nothing Then
    5. ctrl.DropDownStyle = ComboBoxStyle.DropDown
    6. End If
    7. End If
    8. End Sub


    Du musst dann noch im CellValitating Event des Datagridview sicherstellen, dass der eingegebene Freitext in der Datasource deiner Combobox enthalten ist. Wenn er nicht enthalten ist, füge ihn einfach hinzu.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    NooB schrieb:

    Ist das so überhaupt möglich? Und wenn ja wie muss das umgesetzt werden?
    Ich täte zuerstmal fragen: Ist das wirklich nötig und sinnvoll?
    Eine Combo in ein DGV einbasteln ist normal nämlich garkein Problem, das kann man sogar auch ohne Code abhandeln, einfach im Form-Designer.
    Aber Frei-Eingaben da reinzufrickeln ist normal nicht vorgesehen.
    Wenn man solche Daten abspeichern will - wo sollen denn die Frei-Eingaben abgespeichert werden? Und die anderen Combo-Einträge (also die, die nicht gewählt wurden), wo werden die gespeichert?
    Und der neue Eintrag - soll der beim nächsten Öffnen des DropDowns dann auch in der DropDownListe erscheinen?

    Wie gesagt: schwierig.
    Daher vlt. einfacher, du erzählst, warum du so eine aussergewöhnliche Combo in deim DGV zu brauchen meinst.
    Evtl. ist dir mit anderen Ansätzen besser gedient, zB mit AutoCompletion-Funktionalität oder sowas.
    Und:

    NooB schrieb:

    Ich habe mir das so vorgestellt, dass ich über ein zweites Formular über eine Listbox die ComboBox-Einträge verwalte.
    Wozu braucht es dann ne Freitext-ComboBox?
    Waären es sogar DataTable-Zeilen, die man quasi stellvertretend mit der ComboBox auswählt, ergäbe das Vorhaben sogar gar keinen Sinn, weil die ComboBox-Einträge ja nur eine repräsentative Property einen ganzen DataRow wären. Und da kann man nicht einfach mal durch neuen Text ne ganze Zeile anlegen. Es bräuchte ja dann normalerweise deutlich mehr Parameter zur DataRow-Erstellung.
    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.
    Hallo,

    mein Programm erzeugt eine Datei um CNC-Maschinen anzusteuerern. Über das Dropdown möchte ich einfach diverse Attribute definieren können. (z.B. Materialien). In meinen Programmeinstellungen verwalte ich diese Materialliste usw. über eine Listbox, darin enthalten sind dann alle Materialien die auch im Lager sind.

    Da mehrere Benutzer das Programm verwenden, soll auch eine freie Eingabe möglich sein, wenn mal ein Material für eine Baustelle benötigt wird, danach nie mehr. Aus dem DGV bzw. DataTable erzeuge ich mir die Maschinendaten, danach werden die Infos nie mehr benötigt. Daher soll es auch gar nicht in der Listbox hinzugefügt werden.

    Man soll also nur Einträge aus der Listbox wählen können oder eben einen freien Text eintragen können. Beim Schreiben meiner Datei werden die Werte der Tabelle abgefragt.
    Dann verwende keine gebundene Spalte, sondern eine ungebundene TextBox-Spalte. Die befüllst Du dann z.B. damit:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. Dim TB = DirectCast(e.Control, TextBox)
    3. TB.AutoCompleteMode = AutoCompleteMode.Suggest
    4. TB.AutoCompleteSource = AutoCompleteSource.CustomSource
    5. TB.AutoCompleteCustomSource.AddRange(allDeineMaterialien)
    6. End Sub

    Dann kann man Freitext verwenden, aber auch die bekannten/festen Einträge.
    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.