Γειά σας παιδιά,
Εχω ένα ListViewItem στο οποίο γεμίζω τιμές απο ένα datatable που έχει δεδομένα απο ένα sql query.
Ο τρόπος που το γεμίζω είναι :Γειά σας παιδιά,
Ο τρόπος που το γεμίζω είναι :
SqlDataReader sqlFromReader = null; SqlCommand myFromCommand = new SqlCommand("select * "+ "from customer "+ "order by descr", conn); sqlFromReader = myFromCommand.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(sqlFromReader); for (int i = 0; i < dt.Rows.Count; i++) { Application.DoEvents(); ListViewItem litem = new ListViewItem(dt.Rows["CODE"].ToString()); litem.SubItems.Add(dt.Rows["descr"].ToString()); litem.SubItems.Add(dt.Rows["geogrpos"].ToString()); litem.SubItems.Add(dt.Rows["AFM"].ToString()); litem.SubItems.Add(dt.Rows["phone11"].ToString()); litem.SubItems.Add(dt.Rows["lmasterbalance"].ToString()); litem.SubItems.Add(dt.Rows["street1"].ToString()); litem.SubItems.Add(dt.Rows["city1"].ToString()); litem.SubItems.Add(dt.Rows["email"].ToString()); litem.SubItems.Add(dt.Rows["fax1"].ToString()); litem.SubItems.Add(dt.Rows["contact"].ToString()); litem.SubItems.Add(dt.Rows["zipcode1"].ToString()); litem.SubItems.Add(dt.Rows["phone12"].ToString()); litem.SubItems.Add(dt.Rows["meanpaymenttime"].ToString()); litem.SubItems.Add(dt.Rows["meanduetime"].ToString()); litem.SubItems.Add(dt.Rows["tziros"].ToString()); litem.SubItems.Add(dt.Rows["sc_clsid"].ToString()); litem.SubItems.Add(dt.Rows["id"].ToString()); litem.SubItems.Add(dt.Rows["warning"].ToString()); litem.SubItems.Add(dt.Rows["reliability"].ToString()); litem.SubItems.Add(dt.Rows["doy"].ToString()); litem.SubItems.Add(dt.Rows["webpage"].ToString()); litem.SubItems.Add(dt.Rows["epagelma"].ToString()); litem.ToolTipText = "Διαγραφή δεδομένων με συνδιασμό πλήκτρων ctrl + del"; listView1.Items.Add(litem); }
Οταν έχει λίγα δεδομένα πάει καλά. Οταν όμως τα δοδομένα είναι πολλά >10000 τότε καθυστερεί αρκετά.
τι μπορώ να κάνω;
Ευχαριστώ
Δοκίμασες τα BeginUpdate()/EndUpdate() όπως περιγράφεται σε αυτή τη σελίδα του MSDN;
George J.
George J. Capnias:Δοκίμασες τα BeginUpdate()/EndUpdate() όπως περιγράφεται σε αυτή τη σελίδα του MSDN;George J.
Να σου πω το δικίμασα.
Εκανε περίπου 9 δευτερόλεπτα να γεμίσω 13942 εγγραφές και τώρα κάνει περίπου 5 δευτερόλεπτα.
Υπάρχει κάτι καλύτερο ;
Προσπάθησα να το κάνω αλλά κάπου κόλλησα με το virtualMode
Λογικά από τη βάση τα τραβάς γρήγορα. Η καθυστέρηση είναι στην προσθήκη στο listview. Μπορείς να τα βάλεις από τη βάση σε κάποιο List<> και από κει στο listview με VirtualMode.Θα σου φάει λίγο μνήμη παραπάνω. Ένα παράδειγμα με VirtualMode και λίστα με 1000000 items. Καμία καθυστέρηση.
Λογικά από τη βάση τα τραβάς γρήγορα. Η καθυστέρηση είναι στην προσθήκη στο listview. Μπορείς να τα βάλεις από τη βάση σε κάποιο List<> και από κει στο listview με VirtualMode.Θα σου φάει λίγο μνήμη παραπάνω.
Λογικά από τη βάση τα τραβάς γρήγορα. Η καθυστέρηση είναι στην προσθήκη στο listview. Μπορείς να τα βάλεις από τη βάση σε κάποιο List<> και από κει στο listview με VirtualMode.
Θα σου φάει λίγο μνήμη παραπάνω.
Ένα παράδειγμα με VirtualMode και λίστα με 1000000 items. Καμία καθυστέρηση.
List<string> lines = new List<string>(); public Form1() { InitializeComponent(); int size = 1000000; for(int i = 0; i < size; i++) lines.Add("this is line nr " + i); listView1.Columns.Add("colunm"); listView1.VirtualMode = true; listView1.VirtualListSize = size; // listView1.RetrieveVirtualItem += listView1_RetrieveVirtualItem; } private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { e.Item =new ListViewItem(lines[e.ItemIndex]); }
nikos123:Λογικά από τη βάση τα τραβάς γρήγορα. Η καθυστέρηση είναι στην προσθήκη στο listview. Μπορείς να τα βάλεις από τη βάση σε κάποιο List<> και από κει στο listview με VirtualMode.Θα σου φάει λίγο μνήμη παραπάνω. Ένα παράδειγμα με VirtualMode και λίστα με 1000000 items. Καμία καθυστέρηση. List<string> lines = new List<string>(); public Form1() { InitializeComponent(); int size = 1000000; for(int i = 0; i < size; i++) lines.Add("this is line nr " + i); listView1.Columns.Add("colunm"); listView1.VirtualMode = true; listView1.VirtualListSize = size; // listView1.RetrieveVirtualItem += listView1_RetrieveVirtualItem; } private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { e.Item =new ListViewItem(lines[e.ItemIndex]); }Edit : Αντί για List<> το DataTable που έχεις ήδη. e.Item =litem; // litem =... dt.Row[e.ItemIndex]
κάποια εξήγηση για αυτό το τελευταίο;
DataTable dt; private void FillDataTable() { SqlDataReader sqlFromReader = null; SqlCommand myFromCommand = new SqlCommand("select * " + "from customer " + "order by descr", conn); sqlFromReader = myFromCommand.ExecuteReader(); dt = new DataTable(); dt.Load(sqlFromReader); listView1.VirtualListSize = dt.Rows.Count; } private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { int index = e.ItemIndex; ListViewItem litem = new ListViewItem(dt.Rows[index]["CODE"].ToString()); litem.SubItems.Add(dt.Rows[index]["descr"].ToString()); litem.SubItems.Add(dt.Rows[index]["geogrpos"].ToString()); litem.SubItems.Add(dt.Rows[index]["AFM"].ToString()); litem.SubItems.Add(dt.Rows[index]["phone11"].ToString()); litem.SubItems.Add(dt.Rows[index]["lmasterbalance"].ToString()); //... //... //... e.Item = litem; }
ΟΚ,
σε ευχαριστώ.
Δουλευει μια χαρα και σφαίρα!!!