Entwickler-Ecke

WinForms - Programm hängt bei Datatable AddRow


naeschd - Mi 10.03.10 01:28
Titel: Programm hängt bei Datatable AddRow
Hallo zusammen. Ich habe ein mir unerklärliches Problem...
Ich habe eine Datatable (wird nach InitializeComponent() deklariert). Diese wird einem DataGridView zugeordnet:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
InitializeComponent();
....
DataColumn workCol = eepromdatatable.Columns.Add("Page", typeof(Int16));
workCol.AllowDBNull = true;
workCol.Unique = false;
eepromdatatable.Columns.Add("Name", typeof(String));
eepromdatatable.Columns.Add("Length", typeof(Byte));
dg_eeprom.DataSource = eepromdatatable;


Jetzt rufe ich bei einem Ereignis automatisch folgende Funktion auf:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 private void eeprom_table_update()
        {
            DataRow workRow;
             for (int i = 1; i <= 120;  i++)
            {
                workRow = eepromdatatable.NewRow();
                workRow[0] = i;
                workRow[1] = "CustName" + i.ToString();
                workRow[2] = eeprom_index[0, i - 1];

                eepromdatatable.Rows.Add(workRow);
            }
        }


Das Problem ist nun, dass sich das DataGridView aufhängt... Führe ich die obere Funktion manuell aus (d.h. mit Klick auf einen Button), dann funktioniert es.
Komisch ist auch, dass wenn ich weniger Zeilen adde, sodass kein Scrollbalken am DataGridView erscheint, funktioniert es bei einem automatischen Auslösen der Funktion eeprom_table_updat() als auch bei manuellem Klick auf einen Button, der diese Funktion aufruft... Irgendwie muss es was mit dem Scrollen bzw. Aktualisierung des DataGridViews zu tun haben (vermute ich mal)...

Ich habe leider keine Ahnung wo da der Fehler liegen könnte. Wäre nett wenn ihr mir helfen könntet.
Ich danke euch!


JüTho - Mi 10.03.10 08:12

Hallo,

das DGV ist ein ziemlich komplexes Control. Es ist denkbar, dass es durch das ständige Hinzufügen von Daten innerhalb äußerst kurzer Zeit überfordert ist mit dem Neuaufbau.

Benutze einmal SuspendLayout und ResumeLayout; das könnte helfen.

Gruß Jürgen

PS. Zum Formatieren hast du auch die Auswahl "C#" statt "allg. Code".


naeschd - Mi 10.03.10 10:30

Guten Morgen!

Also ich habe es jetzt mit suspend und resume layout probiert. Der Code hierzu sieht so aus

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
        private void eeprom_table_update()
        {
            this.SuspendLayout();
            DataRow workRow;
             for (int i = 1; i <= 120;  i++)
            {
                workRow = eepromdatatable.NewRow();
                workRow[0] = i;
                workRow[1] = "CustName" + i.ToString();
                workRow[2] = eeprom_index[0, i - 1];

                eepromdatatable.Rows.Add(workRow);
           }
             this.ResumeLayout();
        }

Ich habe auch mal in Verzögerungszeiten in die Forschleife mit reingebaut um zu sehen ob das der Datatable einfach zu schnell geht... Bringt leider auch nichts...
Noch was zum Fehler:
Es wird keine Exception oder Ähnliches ausgelöst. Das Programm hängt sich einfach auf (Keine Rückmeldung). Hier ein Screenshot (vielleicht bringts ja was). Sichtbar ist, dass die Scrollleisten des Gridview nicht korrekt angezeigt werden.

shot

Für weitere Hilfe wäre ich sehr dankbar!
Gruß
Matze