Benutzer mit den meisten Antworten
for - Schleife braucht sehr lange

Frage
-
Moin!
Ich habe eine for - Schleife, welche über ein DataGridView läuft und in Abhängigkeit einer Zelle in der jeweiligen Zeile, die ganze Zeile derselben und eines weiteren DataGridView, welches genauso viele Zeilen hat, wie das durchsuchte DGV, unsichtbar setzt. Unerklärlicherweise, dauert dieser Vorgang bei ca 1040 Zeilen weit über eine Minute. Was habe ich falsch gemacht?
for (int i = 0; i < dgvLeft.Rows.Count - 1; i++) { if (Convert.ToInt32(dgvLeft["Status",i].Value) != 1) { dgvLeft.Rows[i].Visible = true; dgvRight.Rows[i].Visible = true; } else { dgvLeft.Rows[i].Visible = false; dgvRight.Rows[i].Visible = false; } }
Antworten
-
Problem gefunden!
Die Ursache für den gigantischen Zeitbedarf findet sich in der Einstellung AutoSizeMode für die Spalten, setzt man diese vor der Schleife auf None, läuft auch die Schleife flott durch.
In folgendem snippet wird exemplarisch die Eigenschaft AutoSizeMode der Spalte 0 geschaltet. Diese Umschaltung muß für alle Spalten durchgeführt werden, bei denen AutoSizeMode nicht auf None steht.
dgvLeft.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None for (int i = 0; i < dgvLeft.Rows.Count - 1; i++) { if (Convert.ToInt32(dgvLeft["Status",i].Value) != 1) { dgvLeft.Rows[i].Visible = true; dgvRight.Rows[i].Visible = true; } else { dgvLeft.Rows[i].Visible = false; dgvRight.Rows[i].Visible = false; } } dgvLeft.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
- Als Antwort vorgeschlagen Florian Haupt Freitag, 10. April 2015 06:31
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 16. April 2015 07:48
- Tag als Antwort aufgehoben Kai Westermann Mittwoch, 29. April 2015 09:54
- Als Antwort markiert Kai Westermann Mittwoch, 29. April 2015 09:59
Alle Antworten
-
Hallo Kai,
ich würde mal probieren, vor der Schleife folgendes auszuführen.
dgvLeft.SuspendLayout(); dgvRight.SuspendLayout();
Nach der Schleife dann:
dgvLeft.ResumeLayout(); dgvRight.ResumeLayout();
Ob der VirtualMode beim DataGridView Control hierbei hilft, weiß ich grad nicht, wäre aber sicherlich einen Versuch wert.
https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.virtualmode.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Das hat leider nichts gebracht. Der virtuelle Modus ist für große Datenmengen gedacht, bei mir hat's mal gerade tausend oder zweitausend Zeilen und außerdem raucht mir da das Hirn. Eigentlich übetrage ich hier nur ein Programm von VB.NET nach C#.NET und da gab es die selbe Schleife, bloß halt 20 mal scneller.
dgvLeft.SuspendLayout(); dgvRight.SuspendLayout(); for (int i = 0; i < dgvLeft.Rows.Count - 1; i++) { if (Convert.ToInt32(dgvLeft["Status",i].Value) != 1) { dgvLeft.Rows[i].Visible = true; dgvRight.Rows[i].Visible = true; } else { dgvLeft.Rows[i].Visible = false; dgvRight.Rows[i].Visible = false; } } dgvLeft.ResumeLayout(); dgvRight.ResumeLayout();
- Bearbeitet Kai Westermann Dienstag, 7. April 2015 12:21
-
Die Schleife enthält nichts von dem ich annehmen würde, das dieses übermäßig viel Zeit in Anspruch nimmt. Sicher das die Zeit in der Schleife verloren geht?
Ggfls. mal einen Performance-Lauf durchführen, dabei zeigt sich in der Regel wo zu viel Zeit benötigt wird und warum.- Florian
-
Problem gefunden!
Die Ursache für den gigantischen Zeitbedarf findet sich in der Einstellung AutoSizeMode für die Spalten, setzt man diese vor der Schleife auf None, läuft auch die Schleife flott durch.
In folgendem snippet wird exemplarisch die Eigenschaft AutoSizeMode der Spalte 0 geschaltet. Diese Umschaltung muß für alle Spalten durchgeführt werden, bei denen AutoSizeMode nicht auf None steht.
dgvLeft.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None for (int i = 0; i < dgvLeft.Rows.Count - 1; i++) { if (Convert.ToInt32(dgvLeft["Status",i].Value) != 1) { dgvLeft.Rows[i].Visible = true; dgvRight.Rows[i].Visible = true; } else { dgvLeft.Rows[i].Visible = false; dgvRight.Rows[i].Visible = false; } } dgvLeft.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
- Als Antwort vorgeschlagen Florian Haupt Freitag, 10. April 2015 06:31
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 16. April 2015 07:48
- Tag als Antwort aufgehoben Kai Westermann Mittwoch, 29. April 2015 09:54
- Als Antwort markiert Kai Westermann Mittwoch, 29. April 2015 09:59