Problem mit Spaltennamen und automatischer Aktualisierung beim DataGridView



  • Hi,
    ich hab da im Moment ein kleines C#-Problem und würde mich freuen, wenn Ihr mir helfen könntet.

    Ich habe folgende Datenklasse:

    class Data
    {
        private SortedList<int, int> dataList = new SortedList<int, int>();
    
        public SortedList<int, int> DataList
        {
            get
            {
                return dataList;
            }
        }
    }
    

    (Bitte fragt nicht, wieso ich nicht einfach direkt die SortedList nehme. In meinem eigentlichen Programm befinden sich in der Klasse nämlich noch ein paar Methoden. Da die aber nichts mit dem Problem hier zu tun haben, hab ich sie rausgelassen.)

    Nun hab ich ein Fenster mit einer Tabelle (DataGridView table), einer BindingSource (BindingSource tableBindingSource) und einem Button (Button addDataset). Der Code in meiner MainForm sieht so aus:

    partial class MainForm : Form
    {
        private Data dataset;
    
        public MainForm()
        {
            InitializeComponent();
        }
    
        private void MainForm_Load(object sender, EventArgs e)
        {
            dataset = new Data();
    
            //Hinzufügen einiger Daten vor dem Anzeigen
            dataset.DataList.Add(1, 100);
            dataset.DataList.Add(8, 87);
            dataset.DataList.Add(5, 0);
    
            //Verbinden der BindingSorce mit den Daten
            tableBindingSource.DataSource = this.dataset;
            tableBindingSource.DataMember = "DataList";
    
            //Verbinden der Tabelle mit der BindingSource
            table.DataSource = tableBindingSource;
        }
    
        private void addDataset_Click(object sender, EventArgs e)
        {
            //Beim Klick auf den Button wird ein neuer
            //Datensatz generiert und hinzugefügt.
    
            Random r = new Random();
    
            int key = r.Next(1,   100),
                val = r.Next(1, 10000);
    
            dataset.DataList.Add(key, val);
            tableBindingSource.Add(new KeyValuePair<int, int>(key, val));
        }
    }
    

    (Ich weiß übrigens, dass die Buttonfunktion nicht ganz korrekt ist, da sie eine Exception wirft, sobald ein Key generiert wird, der schon existiert. Aber auch sie dient nur der Demonstration.)

    Kommen wir nun zu meinen Problemen:

    1. Die Tabellenspalten auf der GUI lauten "Key" und "Value". Wie kann ich ihnen einen eigenen Namen geben?

    2. Wenn die dataset-Variable vor dem Verbinden von Daten, BindingSource und Tabelle keine Einträge besitzt, dann hat die Tabelle nur eine Spalte namens DataList und das Hinzufügen eines Datensatzes scheitert. Wie kann ich das richtigstellen?

    3. Obwohl ich Daten, BindingSource und Tabelle miteinander verbunden habe und das Laden auch funktioniert, klappt es nicht, dass sich die Tabelle beim Hinzufügen automatisch aktualisiert. Ich muss immer beides, Tabelle und Datenvariable, manuell aktualisieren. Wie kann ich das ändern?



  • zu 1:
    this.dataGridView.Columns["Key"].Name = "key";
    this.dataGridView.Columns["Value"].Name = "value";

    zu 2: Bin mir nicht sicher aber lass mal die Zeile weg:
    tableBindingSource.DataMember = "DataList";

    zu 3: Versuch mal
    this.bindingSource.ResetBindings(false);



  • eeee schrieb:

    zu 1:
    this.dataGridView.Columns["Key"].Name = "key";
    this.dataGridView.Columns["Value"].Name = "value";

    Danke. (Allerdings war es nicht das Attribut Name, sondern HeaderText.)

    eeee schrieb:

    zu 2: Bin mir nicht sicher aber lass mal die Zeile weg:
    tableBindingSource.DataMember = "DataList";

    Funktioniert leider nicht. Wenn ich die Zeile weglasse, ist es noch schlimmer, da er die Tabelle dann nicht mal mit vorhandenem Datensatz erstellen kann. Aber das ist auch nicht so wild, da ich hierfür erstmal einen Hack angewandt habe, indem ich dem Datenobjekt einen Datensatz hinzufüge, die Verbindung herstelle und den Datensatz dann wieder lösche.

    eeee schrieb:

    zu 3: Versuch mal
    this.bindingSource.ResetBindings(false);

    Geht leider auch nicht. Wenn ich die Add-Funktion der Tabelle weglasse und stattdessen ResetBindings hinschreibe, wird beim Hinzufügen der Daten nichts angezeigt. Außerdem wäre das ja auch keine so große Verbesserung, denn hier muss ich genauso bei jedem Update die Tabelle manuell mit updaten. Ich dachte mir eigentlich, dass das Programm durch die BindingSource selbst merkt, wenn ich die Datensätze update und dann im Hintergrund selbstständig die Tabelle anpasst.

    Aber wenigstens das wichtigste funktioniert jetzt (der Rest sind ja nur interne Quellcodesachen, die der Benutzer des Programms gar nicht mitbekommt). Also nochmals danke.



  • Frederik schrieb:

    eeee schrieb:

    zu 1:
    this.dataGridView.Columns["Key"].Name = "key";
    this.dataGridView.Columns["Value"].Name = "value";

    Danke. (Allerdings war es nicht das Attribut Name, sondern HeaderText.)

    Ich verwende ein gebundenes DataGridView und binde an ein Klassenobjekt, nicht an eine Datenbank.
    Auch ich möchte statt dem Property-Namen (Spaltennamen) einen anderen Text verwenden (sollte internationalisierbar sein). Bei mir ändert sich die Spaltenüberschrift allerdings nicht, und es wird aber auch keine Exception geworfen. Was mache ich falsch bzw. was kann man da falsch machen?

    Herzlichen Dank!

    P.S.: Finde es sympatisch, dass man sich hier nicht registrieren muss - wegen ein, zwei Fragen bzw. vor allem wegen Antworten ...



  • Frederik schrieb:

    //Verbinden der BindingSorce mit den Daten
    tableBindingSource.DataSource = this.dataset;
    tableBindingSource.DataMember = "DataList";

    Warum so kompliziert? Folgendes reicht aus:

    dataGridView.DataSource = DataSet.Tables[xy];
    

    Frederik schrieb:

    1. Die Tabellenspalten auf der GUI lauten "Key" und "Value". Wie kann ich ihnen einen eigenen Namen geben?

    dataGridView.Columns[xy].HeaderText = "Blabla";
    

    Frederik schrieb:

    Obwohl ich Daten, BindingSource und Tabelle miteinander verbunden habe und das Laden auch funktioniert, klappt es nicht, dass sich die Tabelle beim Hinzufügen automatisch aktualisiert. Ich muss immer beides, Tabelle und Datenvariable, manuell aktualisieren. Wie kann ich das ändern?

    Wäre es Dir möglich statt der Liste einfach eine DataTable zu nutzen? Ich vermute dass dies ein Problem darstellt, denn mit DataTables funzt das immer.


Anmelden zum Antworten