DataGridView, DataTable, Bindingsource, DataGridViewComboBoxColumn

  • C#
  • .NET (FX) 4.5–4.8

    DataGridView, DataTable, Bindingsource, DataGridViewComboBoxColumn

    Moin Leute,
    ich brauche ein DGV mit einem fixen Namen, einer DataGridViewComboBoxColumn zur Auswahl aus wenigen Optionen und einigen editierbaren Double-Werten als Zielparameter.
    Das ganze soll mit Hilfe einer DataTable abspeicherbar sein.
    Auf mycsharp.de habe ich vom @ErfinderDesRades dieses Projekt gefunden, das praktisch alles erschlägt, nur leider fehlt da die DataTable zum Speichern und Laden.
    Wenn ich da über ein DataSet eine DataTable ranhänge, bekomme ich diese InvalidOperationException:
    Objekte, die zur Liste einer BindingSource hinzugefügt werden, müssen alle denselben Typ haben.
    Wie muss eine DataTable aussehen, die zu dieser BindingSource kompatibel ist?
    Oder andersherum:
    Wie muss ich die BindingSource gestalten, damit sie zu einer DataTable {string, int, double, double, double} kompatibel ist, wobei die int-Spalte die DataGridViewComboBoxColumn ist?
    bearbeiteter Auszug vom ErfinderDesRades

    C#-Quellcode

    1. public enum Title
    2. {
    3. King,
    4. Sir
    5. };
    6. private DataSet dataset = new DataSet(); // meins
    7. private DataTable table = new DataTable("Tabelle"); // meins
    8. private void EnumsAndComboBox_Load(object sender, System.EventArgs e)
    9. {
    10. this.table.Columns.Add("Title", typeof(int)); // meins
    11. this.table.Columns.Add("Name", typeof(string));
    12. this.table.Columns.Add("Good", typeof(bool));
    13. //this.dataset.Tables.Add(this.table); // meins, führt zur Exception
    14. //this.bindingSource1.DataMember = "Tabelle";
    15. //this.bindingSource1.DataSource = this.dataset;
    16. // Populate the data source.
    17. this.bindingSource1.Add(new Knight(Title.King, "Uther", true));
    18. this.bindingSource1.Add(new Knight(Title.King, "Arthur", true));
    19. this.bindingSource1.Add(new Knight(Title.Sir, "Mordred", false));
    20. this.bindingSource1.Add(new Knight(Title.Sir, "Gawain", true));
    21. this.bindingSource1.Add(new Knight(Title.Sir, "Galahad", true));
    22. // ...
    23. }
    24. private class Knight
    25. {
    26. public Knight(Title title, string name, bool good)
    27. {
    28. this.Title = title;
    29. this.Name = name;
    30. this.Good = good;
    31. }
    32. public Knight()
    33. {
    34. this.Title = Title.Sir;
    35. this.Name = "<enter name>";
    36. this.Good = true;
    37. }
    38. public string Name { get; set; }
    39. public bool Good { get; set; }
    40. public Title Title { get; set; }
    41. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!