Laden...

DataGridView flackert total und bewirkt hohe CPU-Auslastung

Erstellt von hypersurf vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.213 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren
DataGridView flackert total und bewirkt hohe CPU-Auslastung

Hallo,

ich habe eine BindingList an ein DataGridView gebunden. Das Füllen und Ändern an sich funktioniert soweit auch sehr gut. Am Anfang wird meine Liste mit 72 Einträgen gefüllt. Dabei fängt das Grid bzw. die ganze Maske furchtbar an zu flackern und die CPU-Auslastung geht sage und schreibe auf 50 % hoch. Das Grid hat nur drei Spalten die minimal befüllt werden. Wenn das Grid vollständig gefüllt ist flackert es immer noch 8o

Das Autosizing scheint auch keine Auswirkungen zu haben (es kommt mit und ohne Autosize das komische Flackern).


BindingList<Tor> Torbelegungen = new BindingList<Tor>();
         dgBelegung.AutoGenerateColumns = false;

         DataGridViewTextBoxColumn makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "Tornummer";
         makeColumn.HeaderText = "Tornummer";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "Spedition";
         makeColumn.HeaderText = "Spedition";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "DatumUhrzeit";
         makeColumn.HeaderText = "Datum/Uhrzeit";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         dgBelegung.AutoSize = true;
         dgBelegung.DataSource = Torbelegungen;

         for (int i = 1; i <= 72; i++)
         {
            Torbelegungen.Add(new Tor(i, "", ""));
         }

   class Tor : INotifyPropertyChanged
   {
      public Tor(int pi_intTornummer, string pi_strSpedition, string pi_strDatumUhrzeit)
      {
         m_intTornummer = pi_intTornummer;
         m_strSpedition = pi_strSpedition;
         m_strDatumUhrzeit = pi_strDatumUhrzeit;
      }
      
      public event PropertyChangedEventHandler PropertyChanged;

      private int m_intTornummer;

      public int Tornummer
      {
         get { return m_intTornummer; }
         set 
         { 
            m_intTornummer = value;
            this.NotifyPropertyChanged("Tornummer");
         }
      }
      private string m_strSpedition;

      public string Spedition
      {
         get { return m_strSpedition; }
         set 
         { 
            m_strSpedition = value;
            this.NotifyPropertyChanged("Spedition");
         }
      }
      private string m_strDatumUhrzeit;

      public string DatumUhrzeit
      {
         get { return m_strDatumUhrzeit; }
         set 
         { 
            m_strDatumUhrzeit = value;
            this.NotifyPropertyChanged("DatumUhrzeit");
         }
      }

      private void NotifyPropertyChanged(string name)
      {
         if (PropertyChanged != null)
             PropertyChanged(this, new PropertyChangedEventArgs(name));
      }
   }

Ich verstehe absolut nicht, warum so eine in meinen Augen total einfache Sache so ein Flackern mit hoher CPU-Last verursacht. Habt Ihr eine Idee??

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren

Komischerweise flackert es bei mir auf der Arbeit in Visual Studio 2008 nicht. Zuhause nutze ich Visual Studio 2005. Keine Ahnung ob es daran liegt, nachher mal die Express-Version von 2008 zuhause installieren und testen.

4.931 Beiträge seit 2008
vor 15 Jahren

Evtl. liegt es an DataGridViewAutoSizeColumnMode.AllCells, da damit alle Zellen einträge (auch unsichtbare) abgeprüft werden. Verwende mal testweise DataGridViewAutoSizeColumnMode.DisplayedCells.

Außerdem würde ich noch zwei Optimierungen an deinem Code vornehmen:

  1. Zuerst die BindingList befüllen und danach dann der DataSource zuweisen
  2. Die Setter so abändern, daß nur bei wirklicher Änderung des Wertes NotifyPropertyChanged aufgerufen wird:

         set
         {
            if(m_intTornummer != value)
            {
                m_intTornummer = value;
                this.NotifyPropertyChanged("Tornummer");
            }
         }

P.S: Ungarische Notation ist in C# verpöhnt...

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren

Hallo Th69,

danke für Deine Antwort 🙂
Mit Visual Studio 2008 läuft es jetzt ohne flackern (Autosize hatte ich vorher schonmal auf DataGridViewAutoSizeColumnMode.None gesetzt). Allerdings ist das Grid, wie soll ich sagen, ziemlich langsam. D. h. es scrollt total langsam. Ich spiele schon mit dem Gedanken das Grid manuell, ohne BindingList zu füllen...

P.S: Ungarische Notation ist in C# verpöhnt...

Mag sein, bin ich aber aus der Firma gewöhnt 😉

Edit sagt: Ein Update des Grafikkartentreibers hat Abhilfe gegen das langsame Grid geschaffen!