Automatisch Combobox in DGV durch datatable erzeugen

  • VB.NET
  • .NET (FX) 4.0

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

    Automatisch Combobox in DGV durch datatable erzeugen

    Moinsen,

    eine weitere Frage...

    folgendes Datatable wird generiert:

    VB.NET-Quellcode

    1. dim dtThreas as new Datatable("Threads")
    2. dtThreads.Columns.Add("Subforum", GetType(String))
    3. dtThreads.Columns.Add("Titel", GetType(String))
    4. dtThreads.Columns.Add("Text", GetType(String))


    Ich möchte, wenn ich das ding jetzt in nen DGV lade, dass die erste Spalte als combobox angezeigt wird.
    Eine neue Spalte hinzufügen ist die eine Sache. Ich weiß aber, dass es auch anders gehen muss.
    Zur Auswahl soll bereit stehen:
    Public arrLinks As String() = {"Main Link", "Sublink 1", "Sublink 2", "Sublink 3"}
    Kann man das automatisieren oder muss ich jedes mal erst die erste column löschen und dann neu hinzufügen?
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ich versteh grad nicht, woran es scheitert oder was es mit dem löschen-und-hinzufügen auf sich hat. Wenn Du so mit Columns.Add arbeitest, nimmt er natürliche ne TextBoxColumn her. Du sagst ihm ja nix anderes. Ansonsten: Man nehme ein leeres DGV und dann:

    VB.NET-Quellcode

    1. Dim NewDGVCol As New DataGridViewComboBoxColumn
    2. NewDGVCol.DataSource = {"a", "b", "c"}
    3. DataGridView1.Columns.Add(NewDGVCol)

    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.
    @VaporiZed

    Genau das meine ich.
    Ich habe ne Datatable die gefüllt ist.
    MitDatagridview.datasource=datatable binde ich die Daten aus dem Datatable an das DGV.
    Problem jetzt ist, dass die erste Spalte als normale TB angezeigt wird. Ich müsste die Spalte erst löschen und daraus ne CB spalte machen. Oder eine zusätzliche CB Spalte, die originale ausblenden und dementsprechend den Inhalt anpassen.
    Meine Frage ist nur, ob ich mir das nicht ersparen kann. DGV kann doch so ziemlich alles.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ach jetze.

    VB.NET-Quellcode

    1. DataGridView1.AutoGenerateColumns = False
    2. DataGridView1.DataSource = DeineDataTable
    3. Dim NewCol As New DataGridViewComboBoxColumn
    4. NewCol.DataSource = QuelleDeinerComBoBoxColumnEinträge
    5. NewCol.ValueMember = NameDerQuellenspalteDieAlsWertVerwendetWerdenSoll '*
    6. NewCol.DisplayMember = NameDerQuellenspalteDerenWerteAlsAuswahlAngezeigtWerdenSollen
    7. DataGridView1.Columns.Add(NewCol)

    *ggf. weglassen. Da ich normalerweise ne andere DataTable als Quelle hernehme und da immer ne ID-Spalte drin ist, verwende ich diese dort
    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.
    Besten Dank. Dadurch hab ich aber ejtzt das Problem, dass Rows die ich eintrage nicht mehr in der DT gespeichert werden.
    Muss ich jetzt ne Sub schreiben die das macht, oder mache ich etwas falsch?
    Als Datasource hab ich ja die entsprechende DT. Füge ich jetzt aber ne Row hinzu(manuell) wird diese nicht in die DT übernommen
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Geht bei mir schon. Nimm das mal her:

    VB.NET-Quellcode

    1. Private Cars As New DataTable("Cars")
    2. Private Companies As New DataTable("Companies")
    3. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Cars.Columns.Add("ID", GetType(Integer))
    5. Cars.Columns.Cast(Of DataColumn).Last.Unique = True
    6. Cars.Columns.Cast(Of DataColumn).Last.AutoIncrementSeed = -1
    7. Cars.Columns.Cast(Of DataColumn).Last.AutoIncrementStep = -1
    8. Cars.Columns.Cast(Of DataColumn).Last.AutoIncrement = True
    9. Cars.Columns.Add("Name", GetType(String))
    10. Cars.Columns.Add("CompanyID", GetType(Integer))
    11. Companies.Columns.Add("ID", GetType(Integer))
    12. Companies.Columns.Cast(Of DataColumn).Last.Unique = True
    13. Companies.Columns.Cast(Of DataColumn).Last.AutoIncrementSeed = -1
    14. Companies.Columns.Cast(Of DataColumn).Last.AutoIncrementStep = -1
    15. Companies.Columns.Cast(Of DataColumn).Last.AutoIncrement = True
    16. Companies.Columns.Add("Name", GetType(String))
    17. DataGridView1.AutoGenerateColumns = False
    18. DataGridView1.DataSource = Cars
    19. Dim IDColumn As New DataGridViewTextBoxColumn
    20. IDColumn.DataPropertyName = "ID"
    21. DataGridView1.Columns.Add(IDColumn)
    22. Dim NameColumn As New DataGridViewTextBoxColumn
    23. NameColumn.DataPropertyName = "Name"
    24. DataGridView1.Columns.Add(NameColumn)
    25. Dim CompanyComboColumn As New DataGridViewComboBoxColumn
    26. CompanyComboColumn.DataSource = Companies
    27. CompanyComboColumn.ValueMember = "ID"
    28. CompanyComboColumn.DisplayMember = "Name"
    29. CompanyComboColumn.DataPropertyName = "CompanyID"
    30. DataGridView1.Columns.Add(CompanyComboColumn)
    31. End Sub
    32. Private Sub BtnCreateData_Click(sender As Object, e As EventArgs) Handles BtnCreateData.Click
    33. Companies.Rows.Add(-1, "WV")
    34. Companies.Rows.Add(-2, "BWM")
    35. Cars.Rows.Add(-1, "Minigolf", -1)
    36. Cars.Rows.Add(-2, "Y3", -2)
    37. End Sub

    Dann ist das Eintragen ins DGV gleich mit Änderungen/Ergänzungen in der DataTable verbunden - wie gewünscht.

    Oder denk gleich über nen Wechsel zu nem tDS nach, was aber sicherlich schon längst bekannt ist.
    Schau mal bei EdRs VVV rein. Da gibt's genügend Infos zum schnellen Einstieg.
    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.
    Danke das wars. Es hat nicht geplant, weil ich nicht mit einem Index gearbeitet habe. Weiß nicht genau wo ich mich verschrieben habe aber hat dann doch geklappt. Ich arbeite das ganze noch etwas aus :) Vielen Dank!
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~