DataGridView DataSource festlegen sehr langsam

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von MarvinKleinMusic.

    DataGridView DataSource festlegen sehr langsam

    Hallo zusammen,

    vielleicht habt Ihr ja einen Tipp.

    Ich habe folgende Methode, die mir einen View für ein DataGridView zusammenstellt und dieses dann setzt. Das ganze funktioniert so auch wie es soll. Allerdings sind die Ladezeiten gigangtisch im Verhältnis zu den Datensätzen.

    C#-Quellcode

    1. private void FillDataGridView(DataTable AufgabenTabRaw)
    2. {
    3. lblAnzahl.Text = AufgabenTabRaw.Rows.Count.ToString();
    4. DataTable AufgabenTab = new DataTable();
    5. AufgabenTab.Columns.Add("cA_NR", typeof(int));
    6. AufgabenTab.Columns.Add("cANLAGE_USERID", typeof(String));
    7. AufgabenTab.Columns.Add("cAUFGABE_FAELLIG", typeof(DateTime));
    8. AufgabenTab.Columns.Add("cAUFGABE_START", typeof(DateTime));
    9. AufgabenTab.Columns.Add("cBEARBEITET_USERID", typeof(String));
    10. AufgabenTab.Columns.Add("cfür", typeof(String));
    11. AufgabenTab.Columns.Add("cTITEL", typeof(String));
    12. AufgabenTab.Columns.Add("cBESCHREIBUNG", typeof(String));
    13. AufgabenTab.Columns.Add("cWichtigkeit", typeof(Image));
    14. AufgabenTab.Columns.Add("cDauer", typeof(String));
    15. AufgabenTab.Columns.Add("cGebraucht", typeof(String));
    16. AufgabenTab.Columns.Add("cERLEDIGT_PROZENT", typeof(int));
    17. AufgabenTab.Columns.Add("cERLEDIGT_AM", typeof(DateTime));
    18. AufgabenTab.Columns.Add("bgColor", typeof(Int32));
    19. AufgabenTab.Columns.Add("frontColor", typeof(Int32));
    20. AufgabenTab.Columns.Add("cAnGoU", typeof(String));
    21. AufgabenTab.Columns.Add("cWichtigkeitVal", typeof(Int32));
    22. AufgabenTab.Columns.Add("cAufgabeAnValue", typeof(Int32));
    23. AufgabenTab.Columns.Add("cAnlageUserIdValue", typeof(Int32));
    24. AufgabenTab.Columns.Add("cBearbeitetUserIdValue", typeof(Int32));
    25. for (int i = 0; i < AufgabenTabRaw.Rows.Count; i++)
    26. {
    27. //Berechnung der dar zu stellenden Werte:
    28. String cAnGoUStr, cFürString = "";
    29. int.TryParse(AufgabenTabRaw.Rows[i]["ANLAGE_USERID"].ToString(), out int ANLAGE_USERID);
    30. GlobaleVariabeln.Mitarbeiter.TryGetValue(ANLAGE_USERID, out String ANLAGE_USERID_STR); //cANLAGE_USERID
    31. int.TryParse(AufgabenTabRaw.Rows[i]["BEARBEITET_USERID"].ToString(), out int BEARBEITET_USERID);
    32. GlobaleVariabeln.Mitarbeiter.TryGetValue(BEARBEITET_USERID, out string BEARBEITET_USERID_STR);
    33. int.TryParse(AufgabenTabRaw.Rows[i]["ZEIT_GEBRAUCHT"].ToString(), out int tmpIn);
    34. int ZeitMinuten = tmpIn % 60;
    35. tmpIn = 0;
    36. int.TryParse(AufgabenTabRaw.Rows[i]["ZEIT_GEBRAUCHT"].ToString(), out tmpIn);
    37. int ZeitStunden = tmpIn / 60;
    38. string GebrauchtZeit = ZeitStunden + ":" + ZeitMinuten.ToString("00");
    39. string PlanZeitStr = AufgabenTabRaw.Rows[i]["AUFGABE_DAUER"].ToString();
    40. int.TryParse(AufgabenTabRaw.Rows[i]["AUFGABE_AN_ID"].ToString(), out int AUFGABE_AN_ID);
    41. if (AufgabenTabRaw.Rows[i]["AUFGABE_AN_G_ODER_U"].ToString() == "G")
    42. {
    43. cFürString = "Gruppe: " + GlobaleVariabeln.Arbeitsgruppen.Where(x => x.GRUPPEN_ID == AUFGABE_AN_ID).Select(x => x.GRUPPEN_NAME).FirstOrDefault();
    44. }
    45. else
    46. {
    47. int.TryParse(AufgabenTabRaw.Rows[i]["BEARBEITET_USERID"].ToString(), out int BEARBEITET_USERID_INT);
    48. GlobaleVariabeln.Mitarbeiter.TryGetValue(BEARBEITET_USERID_INT, out String DmaName);
    49. cFürString = DmaName;
    50. }
    51. cAnGoUStr = AufgabenTabRaw.Rows[i]["AUFGABE_AN_G_ODER_U"].ToString() + "," + AUFGABE_AN_ID.ToString();
    52. int bgfarbe = 0, FrontFarbe = 0;
    53. Color Hintergrund = Color.White;
    54. DateTime.TryParse(AufgabenTabRaw.Rows[i]["AUFGABE_FAELLIG"].ToString(), out DateTime AUFGABE_FAELLIG);
    55. int.TryParse(AufgabenTabRaw.Rows[i]["ERLEDIGT_PROZENT"].ToString(), out int ERLEDIGT_PROZENT);
    56. if (AktuellerNode.AktiveDB)
    57. {
    58. if (AUFGABE_FAELLIG > DateTime.Now)
    59. {
    60. double Restzeit = AUFGABE_FAELLIG.Subtract(DateTime.Now).TotalDays;
    61. if (Restzeit <= 2.5)
    62. Hintergrund = Color.FromArgb(-17920);
    63. if (Restzeit <= 1.5)
    64. Hintergrund = Color.FromArgb(255, 187, 0);
    65. if (Restzeit <= 0.8)
    66. Hintergrund = Color.FromArgb(-58112);
    67. if (Restzeit < 0)
    68. Hintergrund = Color.FromArgb(-3407872);
    69. if (ERLEDIGT_PROZENT >= 100)
    70. {
    71. Hintergrund = Color.FromArgb(238, 232, 207);
    72. }
    73. bgfarbe = Hintergrund.ToArgb();
    74. FrontFarbe = GetReadableForeColor(Hintergrund).ToArgb();
    75. }
    76. else
    77. { //Fälligkeit liegt in der Vergangenheit - immer Rot:
    78. bgfarbe = Color.FromArgb(200, 0, 0).ToArgb();
    79. FrontFarbe = Color.White.ToArgb();
    80. if (ERLEDIGT_PROZENT >= 100)
    81. {
    82. Random r = new Random();
    83. //bgfarbe = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)).ToArgb();
    84. bgfarbe = Color.FromArgb(238, 232, 207).ToArgb();
    85. FrontFarbe = Color.Black.ToArgb();
    86. }
    87. }
    88. }
    89. else
    90. {
    91. Hintergrund = Color.FromArgb(238, 232, 207);
    92. bgfarbe = Hintergrund.ToArgb();
    93. FrontFarbe = GetReadableForeColor(Hintergrund).ToArgb();
    94. }
    95. DateTime.TryParse(AufgabenTabRaw.Rows[i]["AUFGABE_START"].ToString(), out DateTime Start);
    96. DateTime.TryParse(AufgabenTabRaw.Rows[i]["ERLEDIGT_AM"].ToString(), out DateTime ERLEDIGT_AM);
    97. int.TryParse(AufgabenTabRaw.Rows[i]["WICHTIGKEIT"].ToString(), out int Wichtigkeit);
    98. int.TryParse(AufgabenTabRaw.Rows[i]["WIEDERHOLUNG"].ToString(), out int WIEDERHOLUNG);
    99. int.TryParse(AufgabenTabRaw.Rows[i]["KARUSSEL_AUFGABE"].ToString(), out int KARUSSEL_AUFGABE);
    100. String nTitel = (WIEDERHOLUNG > 0 ? "\u0298 " : "");
    101. nTitel += (KARUSSEL_AUFGABE > 0 ? "\u2182 " : ""); // u1D25
    102. nTitel += AufgabenTabRaw.Rows[i]["TITEL"].ToString();
    103. AufgabenTab.Rows.Add(AufgabenTabRaw.Rows[i]["A_NR"].ToString(), ANLAGE_USERID_STR, AUFGABE_FAELLIG,
    104. Start, BEARBEITET_USERID_STR, cFürString, nTitel, AufgabenTabRaw.Rows[i]["BESCHREIBUNG"].ToString(),
    105. StarList.Images[Wichtigkeit], PlanZeitStr, GebrauchtZeit,
    106. ERLEDIGT_PROZENT, ERLEDIGT_AM, bgfarbe, FrontFarbe, cAnGoUStr, Wichtigkeit,
    107. AUFGABE_AN_ID, ANLAGE_USERID, BEARBEITET_USERID);
    108. } //ENDE FOR
    109. //Alle Aufgaben in die Liste oben einfügen und diese dann zur Anzeige nutzen.
    110. view.Dispose();
    111. view = AufgabenTab.DefaultView;
    112. DataGridViewX source = dataGridViewX1;
    113. source.SuspendLayout();
    114. source.AutoGenerateColumns = false;
    115. source.DataSource = view; // Diese Zeile verlangsamt alles so stark!
    116. if (AktuellerNode.SubNodeType == SubNodeType.Erledigte)
    117. {
    118. source.Columns[cERLEDIGT_AM.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    119. }
    120. if (!Properties.Settings.Default.DauerAnzeigen)
    121. {
    122. source.Columns["cDauer"].Visible = false;
    123. source.Columns["cGebraucht"].Visible = false;
    124. }
    125. source.Columns["cWichtigkeitVal"].Visible = false;
    126. source.Columns["cAufgabeAnValue"].Visible = false;
    127. if (AktuellerNode.AktiveDB)
    128. {
    129. source.Columns[cERLEDIGT_PROZENT.Index].Visible = true;
    130. source.Columns[cfür.Index].Visible = true;
    131. source.Columns[cERLEDIGT_AM.Index].Visible = false;
    132. }
    133. else
    134. {
    135. source.Columns[cERLEDIGT_PROZENT.Index].Visible = false;
    136. source.Columns[cfür.Index].Visible = false;
    137. source.Columns[cERLEDIGT_AM.Index].Visible = true;
    138. }
    139. if (AktuellerDock == dcSuche)
    140. {
    141. source.Columns[cERLEDIGT_AM.Index].Visible = true;
    142. source.Columns[cERLEDIGT_AM.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    143. }
    144. source.Columns[cBESCHREIBUNG.Index].Visible = false;
    145. source.Columns[cAnGoU.Index].Visible = false;
    146. source.Columns[cBearbeitetUserIdValue.Index].Visible = false;
    147. source.Columns[cAufgabeAnValue.Index].Visible = false;
    148. source.Columns[cWichtigkeitVal.Index].Visible = false;
    149. source.Columns[cAnlageUserIdValue.Index].Visible = false;
    150. if (this.Cursor == Cursors.WaitCursor)
    151. this.Cursor = Cursors.Default;
    152. if (tb_FilterTitel.Text != "")
    153. view.RowFilter = "cTITEL like '%" + tb_FilterTitel.Text + "%'"; // OR BESCHREIBUNG like '%" + tb_searchTitel.Text + "%'
    154. else if (tb_FilterFür.Text != "")
    155. view.RowFilter = "cfür like '%" + tb_FilterFür.Text + "%'"; // OR BESCHREIBUNG like '%" + tb_searchTitel.Text + "%'
    156. else if (tb_FilterZugewiesen.Text != "")
    157. view.RowFilter = "cBEARBEITET_USERID like '%" + tb_FilterZugewiesen.Text + "%'"; // OR BESCHREIBUNG like '%" + tb_searchTitel.Text + "%'
    158. Cursor.Current = Cursors.Default;
    159. source.ResumeLayout();
    160. }


    Ich habe den gesamten Code schon gedebugt und alles geht sehr schnell von statten, außer diese Zeile:
    source.DataSource = view; // Diese Zeile verlangsamt alles so stark!

    Die verdoppelt die Ladezeit gut mal. So braucht er z.B. für eine Zeile fast 1 ganze Sekunde. Für die ganze Berechnung der Zeile gehen aber nur wenige ms drauf.

    Ich bin mit meinem Latein hier echt am Ende.

    Viele Grüße,
    Marvin
    1 Sekunde pro Zeile? Da läuft aber ganz schön was ab.
    Geht es ggf. auch ohne DefaultView in view = AufgabenTab.DefaultView;? Was ist view überhaupt? Keine Deklaration zu sehen.
    Wenn Du nur die DataTable definierst und eine entsprechende Anzahl leerer Zeilen reinschreibst, wie lange dauert es dann?
    Ist da noch irgendwo ne BindingSource im Spiel.
    Wenn ich 1000 Zeilen in ne DataTable einlese und dann die nem DGV zuspeise, ist das in ca. 0,2 s erledigt.
    Wie verhält sich ein normales DGV im Vergleich zu Deinem DGVX?
    Probier es mal testweise ohne Ansichtnachbearbeitung und die Filter am Ende. Bringt das eine relevante Änderung?

    btw: Eine 192-Zeilen-Sub? Behältst Du da noch Übersicht? ggf. aufspalten in Funktionseinzelteile.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    jo, es geht ja auch nicht um ein Datagridview, sondern um ein DatagridViewX - wer weiss, was da alles eingebaut ist!
    Probeweise könnteste mal ein normales Datagridview hinzu-nehmen - kannst ja AutoGenerteColumns=true belassen.
    Ich vermutefast

    C#-Quellcode

    1. source.DataSource = view; // Diese Zeile verlangsamt alles so stark!
    2. normalesDgv.DataSource = view; // Diese Zeile vermutlich deutlich schneller!

    Hallo nochmal,

    vielen Dank für eure Beiträge. Ich habe das Problem mittlerweile lokalisiert.

    Ich habe mal zum Test alle Events des DataGridViewX die ich abonniert habe, vor dem Wechsel der DataSource deabonniert. Dabei konnte ich bestimmen woher die Ladezeiten gekommen sind. Das RowEnter Event wurde scheinbar automatisch beim wechsel der Source aufgerufen. In diesem Event wiederrum werden mehrere Daten vom Server abgefragt, wo für die Kommunikation x ms benötigt werden.

    Das ganze ließ sich nun relativ leicht fixen:

    C#-Quellcode

    1. source.RowEnter -= DataGridViewX1_RowEnter; // Das Event wird deabonniert, um die Ladezeit zu verkürzen
    2. source.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    3. source.DataSource = view;
    4. source.RowEnter += DataGridViewX1_RowEnter; // Hier wieder abonnieren


    @ErfinderDesRades das DataGridViewX stammt aus der DotNetBar und bietet im Vergleich zum normalen DataGridView viele weitere Optionen. An der Stelle wird es verwendet, da das Programm über die DotNetBar mit einem StyleManager gesteuert wird, welcher nur die Styles von DotNetBar Komponenten steuern kann.

    Viele Grüße,
    Marvin