none
for - Schleife braucht sehr lange RRS feed

  • 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;
    	}
    }


    Mittwoch, 1. April 2015 10:50

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

    Freitag, 10. April 2015 06:24

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

    Mittwoch, 1. April 2015 11:17
    Moderator
  • 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();


    Dienstag, 7. April 2015 12:20
  • 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

    Donnerstag, 9. April 2015 08:03
  • 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

    Freitag, 10. April 2015 06:24