Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   C# listView zu langsam? (https://www.delphipraxis.net/53452-listview-zu-langsam.html)

faux 16. Sep 2005 22:18


listView zu langsam?
 
Hallo!

Ich will 100.000 bis 1.000.000 Einträge in eine listView eintragen. Die Werte habe ich berechnet und sind in einem Array des Typen ListViewItem. Ich weise dann die listView mittels Items.AddRange an, diesen Array einzufügen. Jedoch dauert dies aus verständlichen Gründen bis zu 2 Minuten. In dieser Zeit ist die Form nicht ansprechbar.
Muss ich dafür einen Thread machen, dass die Form trotzdem ansprechbar ist?

Danke schon mal.
Faux

n0b0dy 16. Sep 2005 22:30

Re: listView zu langsam?
 
joa ListView is echt sau lahm.
nimm doch nen VirtualStringTree. ist zwar ein Tree, aber kannste auch als Liste nehmen ;) UND is HAMMER SCHNELL. siehe demos ;)

LINK

phXql 16. Sep 2005 22:31

Re: listView zu langsam?
 
Zitat:

Zitat von n0b0dy
joa ListView is echt sau lahm.
nimm doch nen VirtualStringTree. ist zwar ein Tree, aber kannste auch als Liste nehmen ;) UND is HAMMER SCHNELL. siehe demos ;)

LINK

in c#? wäre mir neu...

n0b0dy 16. Sep 2005 22:33

Re: listView zu langsam?
 
ui schei*e das tut mir echt leid :((((

hab das voll verpeilt

Luckie 16. Sep 2005 22:42

Re: listView zu langsam?
 
Eine Millionen Einträge in einem List dem Benutzer zur Auswahl anbieten. Na der wird sich bedanken. ;)

faux 16. Sep 2005 23:12

Re: listView zu langsam?
 
Es ist eher zum nachsehen eines bestimmten Eintrags gedacht. Das ganze per Suche zu erledigen, wäre sicher besser... :D

alzaimar 17. Sep 2005 07:16

Re: listView zu langsam?
 
Erstmal gibt es ein BeginUpdate/EndUpdate. Jedenfalls in der VCL, vermutlich auch in .Net.

Und es gibt für die Listview in der VCL einen 'VirtualMode'. Dann wird nämlich nur die Anzahl der Einträge vorgegeben, befüllen muss man es nicht. Die Listview holt sich dann über ein OnGetData (Zeilennr) die in der X.ten Zeile darzustellenden Daten. Damit erübrigt das 'Befüllen' und die ListView wird _sofort_ dargestellt.

MathiasSimmack 17. Sep 2005 07:40

Re: listView zu langsam?
 
Zitat:

Zitat von alzaimar
Erstmal gibt es ein BeginUpdate/EndUpdate. Jedenfalls in der VCL, vermutlich auch in .Net.

Yo. :) Heißen sogar auch so.

faux 17. Sep 2005 21:40

Re: listView zu langsam?
 
Bei mir nicht... lol

MagicAndre1981 17. Sep 2005 22:11

Re: listView zu langsam?
 
Zitat:

Zitat von faux
Bei mir nicht... lol

Delphi-Quellcode:
listView1.BeginUpdate();

listView1.EndUpdate();
Na logo heißen die so. Sogar in .NET 2.0 ;-)

faux 17. Sep 2005 22:14

Re: listView zu langsam?
 
Bin ich blind? :wall:

Hir mal die Eigenschaften: http://img107.imageshack.us/img107/5...led25bo.th.gif

NACHTRAG:
Zitat:

Delphi-Quellcode:
listView1.BeginUpdate();

listView1.EndUpdate();

Ups, ich dachte das sind Events... :oops:
Danke.

alzaimar 19. Sep 2005 08:37

Re: listView zu langsam?
 
Gut, nachdem das geklärt ist... gibt es auch den virtual mode (Property "OwnerData"=True)? Vermutlich ja. Demm damit bekommst Du eine Listview mit 4.294.967.295 Einträgen innerhalb von 1ms angezeigt.

Delphi-Quellcode:
Procedure TForm1.FillData (aCount : Integer);
Begin
  ListView1.OwnerData := True;
  ListView1.Items.Count := aCount;
  ListView1.OnData := ListView1Data;
End;

procedure TfmEditCustomer.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := MyUserData[Item.Index].MainTitle;
  Item.ImageIndex := MyUserData[Item.Index].DataType;
...
End;

faux 19. Sep 2005 14:32

Re: listView zu langsam?
 
OwnerData hab ich leider nicht....

alzaimar 19. Sep 2005 15:04

Re: listView zu langsam?
 
Also, ich find bei msdn was über 'Virtual mode'. Wenn es die 'VirtualListSize' Property gibt, dann den Rest wohl auch.
So wie ich das sehe (obwohl ich noch nie .NET programmiert habe), setzt Du damit eine Cache-Größe. Dann gibt es ein Event 'CacheVirtualItems' oder so, das wohl immer dann aufgerufen wird, wenn mal wieder einige Items neu geladen werden müssen.

faux 19. Sep 2005 15:22

Re: listView zu langsam?
 
Hallo!

Ja, ich habe die Properties VirtualMode und VirtualListSize. Was meinst du mit "den Rest dann wohl auch"?
Kannst du mir den Link zum MSDN-Beitrag schicken? Ich finde unter VirtualMode nix... :?

generic 19. Sep 2005 15:58

Re: listView zu langsam?
 
virtualstringtree

der mike lischke arbeitet an einer .net verson.
ggf. ist schon eine version in der sourceverwaltung.

ich meine etwas gelesen zuhaben.

Robert_G 19. Sep 2005 16:53

Re: listView zu langsam?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Da du (anhand des Screenies erkennbar) .Net 2.0 nimmst:
Schaue dir mal den DataGridView an. Das ist ein Hybride aus ListView und dem DataGrid.

Nur um das mal nachvollziehen zu können, habe ich mal eine ClassLib mit einer Klasse mit 2 Properties sowie einer BindingList, die eine Überladung für Add bekam angelegt:
Code:
public class SomeClass
{
    string someString;
    int someInt;

    public string SomeString
    {
        get { return someString; }
        set { someString = value; }
    }
    public int SomeInt
    {
        get { return someInt; }
        set { someInt = value; }
    }

    public SomeClass(int someInt, string someString)
    {
        this.someInt = someInt;
        this.someString = someString;
    }
}
Code:
public class SomeClassCollection : BindingList<SomeClass>
{
    public void Add(int someInt, string someString)
    {
        Add(new SomeClass(someInt, someString));
    }
}
Im WinApp Project wählst du über Data\Add Datasource deine Klasse (nicht die Collection) aus der ClassLib aus.
In der DataSource Ansicht kannst du nun den Mapping type der Klasse auf DataGridView stellen und sie danach einfach auf dein Form ziehen. *plopp* Ist der vorkonfigurierte DGV und eine BindingSource auf deinem Form.

Im Click handler des Buttons habe ich das reingepackt:
Code:
SomeClassCollection collection = new SomeClassCollection();
for ( int i = 0; i < 100000; i++ )
{
    collection.Add(i, i.ToString());
}
bindingSource1.DataSource = collection;
Draufdrücken -> *foomp* -> sofort sieht man die Daten...

Du kannst auch da virtual arbeiten wenn es dir nicht schnell genug ist. Ich habe noch keine Performance engpässe bei realistischen Datenmengen bemerkt. (Realistisch und praktikabler ist _wesentlich_ kleiner als 100.000! ;) )

Auf die Art hast du netten Designtime support ohne auf ein lahmes DataSet ausweichen zu müssen, oder dir eine full fledged designtime Listen Klasse selbst schreiben zu müssen...

edit: noch 2 screenies angehängt

faux 19. Sep 2005 17:48

Re: listView zu langsam?
 
Danke Robert!
Ich habe beim suchen der Komponente schon die DataGrid im Visier, hab aber keine passende Ansicht zusammen bekommen...
Dass es das DataGridView gibt, hab ich anscheinend übersehen... :wink:
Werds mal testenm ob das schneller ist.

Grüße
Faux

faux 19. Sep 2005 17:58

Re: listView zu langsam?
 
@Robert:

Wie nennt sich das, was du da machst? Bis zum Doppelpunkt versteh ists ja :wink:, aber dann is mir unklar... :oops:

Code:
public class SomeClassCollection : BindingList<SomeClass>


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz