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??
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.
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:
set
{
if(m_intTornummer != value)
{
m_intTornummer = value;
this.NotifyPropertyChanged("Tornummer");
}
}
P.S: Ungarische Notation ist in C# verpöhnt...
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!