Laden...

DGV Performance erhöhen - Anzeige von sich schnelländernden Daten

Erstellt von planetberlin vor 10 Jahren Letzter Beitrag vor 10 Jahren 889 Views
planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 10 Jahren
DGV Performance erhöhen - Anzeige von sich schnelländernden Daten

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:

  • Wie kann ich es schaffen, dass das DataGridView die sich änderne Mausposition schneller anzeigt?

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

T
708 Beiträge seit 2008
vor 10 Jahren

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

O
449 Beiträge seit 2005
vor 10 Jahren

Eine andere alternative ist der Virtual Mode des dgv.

Virtuellen Modus implementieren

Grüße Oli

Viele Grüße, Oli

49.485 Beiträge seit 2005
vor 10 Jahren

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