Hallo Forum,
Ich habe eine Frage zur Datagridview-Performance. Ich habe mehrere andere Themen dazu schon gefunden, allerdings treffen diese nicht ganz auf das Problem zu, was ich aktuell habe.
Bitte schaut mal auf das angehängte Bild. Ich versuche im gezeigten Testprogramm eine Mausposition eines Usercontrols in einem datagridview darzustellen.
1: zeigt die Mausposition im Usercontrol
2: zeigt die Mausposition des Usercontrols in der MainForm (via Eventdelegate)
3. zeigt die Mausposition in dgv (100 Zeilen)
Im EventHandler der MainForm sind die Punkte 2 und 3 aufgeführt:
private void EventHandler(float _x, float _y)
{
// 2 - zeigt die Mausposition des Usercontrols
lbl_x.Text = _x.ToString();
lbl_y.Text = _y.ToString();
// 3 - zeigt die Mausposition des Usercontrols im DGV
foreach (DataGridViewRow dr in dgv_mouse.Rows)
{
dgv_mouse.Rows[dr.Index].Cells[1].Value = _x.ToString("N2");
dgv_mouse.Rows[dr.Index].Cells[2].Value = _y.ToString("N2");
}
}
Wenn ich nun die Maus über das Usercontrol bewege, wird die Mausposition wie beschrieben angezeigt bzw. an das MainForm delegiert und angezeigt. Im DataGridView allerdings gibt es massive Performance Probleme. Ab etwa 100 Zeilen, stockt das ansonsten flüssige anzeigen/ delegieren der Mausposition.
Daher meine Frage:
Im Falle ich lasse den foreach loop aus dem EventHandler weg, ist das Anzeigen der Mausposition in der MainForm superschnell, also Eventdelegate funktioniert ohne Probleme - es liegt eindeutig am DataGridView bzw. am foreach-loop den ich nutze um die Mauspositionen im DGV anzuzeigen.
Beim beschriebenen Problem handelt es sich nur um einen Test für ein anderes Projekt mit dem Ziel herauszufinden was/ wer die Performance probleme verursacht. So wie es sich zeigt, kommt das DGV nicht zurecht mit vielen, sich schnelländernen Daten/ Cellwerten.
Ich benötige Eure Hilfe,
Das Ziel sollte sein, dass sich schnell ändernde Daten hier z.B. die Mauspositionen X u. Y sauber im DGV angezeigt werden. Auch bei mehr als 500 Zeilen ++ noch.
Vielen Dank im Vorraus
pb
Hallo planetberlin,
wenn Du eine Tabelle auf eine Tafel zeichnest und alle Werte immer wieder wegwischst und mit der Kreide neu aufmalst, kostet das Zeit. Viel Zeit.
Nun hast Du den Fall konstruiert, für 100 Zeilen die Werte zu ändern, obwohl Du nur ca. 8 Stück siehst. Je mehr Zeilen, je länger dauert das. An sich logisch 😃
Um das zu umgehen, bietet das DataGridView ein Databinding. Das ist sogar so schlau, nur die Bereiche neu zuzeichnen, die auch angezeigt werden.
Also bau Dir eine Liste, die die X & Y speichert und verändere auch nur diese Liste. Die bindest Du dann an das DGV und die Performance sollte sich deutlich verbessern.
Gruß
trib
Viele Grüße, Oli
Hallo planetberlin,
wenn das Event beliebig oft bzw. beliebig schnell hintereinander gefeuert werden kann, ist es zudem besser, die Daten nicht jedes Mal sofort zu aktualisieren, sondern nur z.B. 10mal pro Sekunde. Du kannst die Daten z.B. im EventHandler sammeln und die gesammelten Daten per Timer in GUI schieben. Das solltest du aber schon in einem der anderen Thread gelesen habe. Ich verstehe generell nicht, warum du meinst, dass dein Fall anders liegt. Der liegt eigentlich in jeder Hinsicht wie üblich. Dass die Daten im UserControl und im MainForm angezeigt werden sollen, macht doch keinen Unterschied.
herbivore