Laden...

Vergleich DatagridView - ListView

Erstellt von ErfinderDesRades vor 16 Jahren Letzter Beitrag vor 13 Jahren 17.566 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 16 Jahren
Vergleich DatagridView - ListView

Ein bisserl scheinheilig, der Titel. Im Grunde will ich zeigen, daß, um Tabellen anzuzeigen, das Grid dem ListView in Detail-Ansicht signifikant überlegen ist.

**Grids Vorzüge:***Befüllung ca. 25-mal schneller, und einfacher zu coden *Hinzufügen/Editieren/Löschen von Daten *Sortierung nach klickbarer Spalte *Umsortieren der Spalten-Reihenfolge *Datenbindefähigkeit *Trennung von Daten und View *Unterstützung jeden Datentyps *Einstellbares Autosize-Verhalten der Spalten: Fill, AllCells, None (resizable by User) etc.

Mit dem Autosize-Verhalten der Spalten kann man die Befüllung übrigens recht verlangsamen - bei vielen Datensätzen und vielen Spalten ist DataGridViewAutoSizeColumnMode.AllCells vllt. nicht die erste Wahl.

[EDIT]: Hervorheben möchte ich nochmal die Databinding-Fähigkeit: Als Datasource kann ich eine meinen Daten angemessene Auflistung wählen, und deren Fähigkeiten voll nutzen - das Grid passt sich dem an. Etwa die Filterfunktionen einer Bindingsource, oder Such-Funktionen einer Datatable.
Ein Listview müsste man jeweils durchsuchen, und alle Einträge konvertieren (es "kann" ja nur string), um vergleichbare Operationen durchzuführen. Designmäßig sehr problematisch, da intensive Verquickung von Daten und View.[/EDIT]

Aber es sieht anders aus. Und hat keine Icons.
Das kann man stylen, wenn Wert darauf gelegt wird. Weitgehend im Designer, inclusive einer eigenen Spalte für Icons.
Nur für eine Spalte mit Icon muß man das CellPaint-Event bemühen.

Die Stärke des LV liegt eben in der Gruppier-Fähigkeit, und in den verschiedenen Views, die möglich sind.
Ist man auf eines dieser Features angewiesen, kann man's DGV natürlich knicken (naja, zu "Gruppieren" hat man vllt. die Alternative: "Parent-Child-View")

Hier mal ein Foto vonnem auf "ListView" getrimmten DGV.
Also das Linke ist das DGV, das Rechte ein ListView.

Der frühe Apfel fängt den Wurm.

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 16 Jahren

Muß natürlich noch die Solution dran:

Der frühe Apfel fängt den Wurm.

2.760 Beiträge seit 2006
vor 16 Jahren

Ich stimme dir in allen Punkten voll und ganz zu, nur ergänzend:
Wenn man auf das ListView aus irgend einem Grund angewiesen ist und mit vielen Daten hantieren muss sollte man dem VirtualMode den es seit .Net 2.0 gibt eine Chance geben.

68 Beiträge seit 2008
vor 13 Jahren

Ich habe einen erwähnenswerten Fehler in diesem Beispielprojekt gefunden: Du befüllst das ListView mit .Items.Add in der Schleife, anstatt die schnellere Items.AddRange-Methode zu verwenden. Das beschleunigt das Befüllen des ListView um mindestens 80-100%, also gut doppelt so schnell. Direkter Vergleich auf meiner Maschine (C2Q, 2,83 GHz): DGV ~30ms, LV ~120ms. "25-mal schneller" halte ich doch eher für unwahrscheinlich, denn selbst auf meiner älteren Testmaschine (P4, 3 GHz) erreiche ich diese Differenz nicht annähernd.


       private void FillListView() {
         Stopwatch SW = Stopwatch.StartNew();
         ListViewItem[] items = new ListViewItem[RowCount];
         for (int i = 0; i < RowCount ; i++) {
            ListViewItem lvi = new ListViewItem(i.ToString()); // this.ListView1.Items.Add(i.ToString());
            lvi.UseItemStyleForSubItems = false;
            lvi.ImageIndex = i % this.ImageList1.Images.Count;
            ListViewItem.ListViewSubItem lvsi = lvi.SubItems.Add(i.ToString());
            lvsi.BackColor = Color.Red;
            lvsi = lvi.SubItems.Add(i.ToString());
            lvsi.BackColor = Color.Blue;
            lvsi = lvi.SubItems.Add(i.ToString());
            lvsi.BackColor = Color.Violet;
            lvsi = lvi.SubItems.Add(i.ToString());
            lvsi = lvi.SubItems.Add(i.ToString());
            items[i] = lvi;
         }
         this.ListView1.BeginUpdate();
         this.ListView1.Items.Clear();
         this.ListView1.Items.AddRange(items);
         this.ListView1.EndUpdate();
         this.ToolStripStatusLabel1.Text = string.Format(
            "filled in {0} Milliseconds", SW.ElapsedMilliseconds);
       }

U
208 Beiträge seit 2008
vor 13 Jahren

Hallo ErfinderDesRades,

stimme dir grundsätzlich auch zu. Allerdings muss ich noch zu dem Punkt des Aussehens bzw. der Gestaltungsmöglichkeit etwas loswerden. 🙂

Das kann man stylen, wenn Wert darauf gelegt wird. Weitgehend im Designer, inclusive einer eigenen Spalte für Icons.
Nur für eine Spalte mit Icon muß man das CellPaint-Event bemühen.

Dein Beispiel der Gestaltungsmöglichkeit von DGV und LV, mit am Ende gleichem/ähnlichem Ergebnis bei beiden Controls ist ja nett, und zeigt auch, was technisch so möglich ist. Aber mal ehrlich: Mit Ästhetik hat das ja nun nichts mehr zu tun. 😉

ListViews haben dagegen zusätzlich den für mich recht wichtigen Pluspunkt, dass man sie dem Style des Betriebssystems (bzw. des Explorers) anpassen kann (SetWindowTheme-Funktion). So erreicht man z.B. unter Vista/7 den netten Aero-Effekt, der sich beim Hovern und Auswählen von Items bemerkbar macht. Und der macht optisch schon einiges her, finde ich.
Wobei sich bei solchen Fragen wohl alle Geister scheiden... Ich persönlich leg recht viel Wert auf die Optik meiner Programme und versuche die UX Guidelines von Microsoft einzuhalten. Und da passt eine DGV leider nicht immer so gut rein.