Benutzer mit den meisten Antworten
DataGridView Style setzen ( performance problem)

Frage
-
Hallo,
ich möchte bestimmte Zeilen eines DGV anders darstellen. Dazu weise ich den Zeile ndas entsprechende Style zu.
foreach (DataGridViewCell cell in this .dataGridView1.Rows[i].Cells) if (...)cell.Style = meinStyle;
Das setzen dauert allerdings sehr lang. Bei ein paarhundert Zeilen kann das schon eine Minute dauert bis er alle Zeilen durchgegangen ist.
Das neu belegen des DefaultCellStye dauert genauso lange.
Ich vermute ja das gesamte DGV führt bei jedem setzen des Styles ein update durch. Wie kann ich das verhindern sodass sich das DGV erst nach dem durchgehen aller Zeilen neu berechnet?
danke.
- Bearbeitet Christian.Bertram Sonntag, 21. November 2010 19:00
Antworten
-
Habe das Problem gefunden.
Beziehungsweise eher einen workaround.
Anstatt des kompletten Styles setze ich jetzt direkt die Schriftfarbe des Styles.
cell.Style.ForeColor = myColor;
Und Schwupps, schon braucht das DGV statt einer Minute nur noch eine Sekunde zum laden -_-
- Als Antwort markiert Christian.Bertram Sonntag, 21. November 2010 21:51
Alle Antworten
-
Guten Abend vegi,
Ich gehe ebenfalls davon aus, dass das DGV bei jedem Setzen eines Styles die LayoutLogik aufruft.
Möglicherweise hilft es dir, wenn du vor besagter Manipulation deine Cells-Objekte zunächst für das DGV die von Control geerbte Methode Control.SuspendLayout() aufrufst und nach besagter Manipulation Control.ResumeLayout() aufrufst.
Die Control.ResumeLayout(Boolean performLayout)-Überladung erlaubt es dir auch gleich ein Update des Layoutes zu erzwingen.
Ich hoffe ich konnte ein wenig helfen und dir eine performantere Anwendung bescheren.
Liebe Grüße,
Christopher Kellner -
Habe das Problem gefunden.
Beziehungsweise eher einen workaround.
Anstatt des kompletten Styles setze ich jetzt direkt die Schriftfarbe des Styles.
cell.Style.ForeColor = myColor;
Und Schwupps, schon braucht das DGV statt einer Minute nur noch eine Sekunde zum laden -_-
- Als Antwort markiert Christian.Bertram Sonntag, 21. November 2010 21:51
-
Hallo V.,
zum einen kann es helfen, den Wert der AutoSizeColumnsMode -Eigenschaft (ggf. auch die der Rows) auf weniger berechnungsintensive Modi zu stellen (etwa None) - (wenn es denn umgesetzt wurde). Zum anderen wird in solchen Performance-Szenarien oft der VirtualMode benutzt:
[Nutzung grosser Datenmengen beim DataGridView]
http://dzaebel.net/DgvVirtual.htmDadurch muss das DataGridView nur das aktualisieren, was im sichtbaren Bereich ist.
Andere Möglichkeiten wären:
[Leistungsoptimierung im DataGridView-Steuerelement in Windows Forms]
http://msdn.microsoft.com/de-de/library/ms171621.aspx[Fixing a slow scrolling DataGridView]
http://bitmatic.com/c/fixing-a-slow-scrolling-datagridview
[C# WinForms DataGridView background color rendering too slow - Stack Overflow]
http://stackoverflow.com/questions/1630066/c-winforms-datagridview-background-color-rendering-too-slowU.a. ist es beim Setzen eines Style ist häufig ein Font, der neu erstellt wird. Diesen sollte man möglichst einmalig im Programm halten (und dann diese Instanz zuweisen), um zu verhindern, dass er für jede Zelle neu instanziiert wird, was viel Zeit benötigt.
ciao Frank -
Hallo vegi,
Sieh Dir mal auch das CellFormatting-Ereignis an. Du kannst dort die gewünschte Formattierungs-Logik implementieren. Leistungseinbußen verhinderst Du, indem Du nicht direkt auf das DGV zugreifst, sondern über die Parameter des Ereignishandlers.
DataGridView.CellFormatting-Ereignis:
http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridview.cellformatting.aspxGruß
Marcel