Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

αργό listview

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος evagelos στις 08-08-2012, 10:56. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-08-2012, 13:07 71053

    αργό listview

    Γειά σας παιδιά,

    Εχω ένα ListViewItem στο οποίο γεμίζω τιμές απο ένα datatable που έχει δεδομένα απο ένα sql query.

    Ο τρόπος που το γεμίζω είναι :
    Γειά σας παιδιά,

    Εχω ένα 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.RowsIdea["CODE"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["descr"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["geogrpos"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["AFM"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["phone11"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["lmasterbalance"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["street1"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["city1"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["email"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["fax1"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["contact"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["zipcode1"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["phone12"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["meanpaymenttime"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["meanduetime"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["tziros"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["sc_clsid"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["id"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["warning"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["reliability"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["doy"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["webpage"].ToString());
                        litem.SubItems.Add(dt.RowsIdea["epagelma"].ToString());
    
                        litem.ToolTipText = "Διαγραφή δεδομένων με συνδιασμό πλήκτρων ctrl + del";
                        listView1.Items.Add(litem);
                    }

    Οταν έχει λίγα δεδομένα πάει καλά. Οταν όμως τα δοδομένα είναι πολλά >10000 τότε καθυστερεί αρκετά.

    τι μπορώ να κάνω;

     

    Ευχαριστώ

     

     

  •  07-08-2012, 15:07 71054 σε απάντηση της 71053

    Απ: αργό listview

    Δοκίμασες τα BeginUpdate()/EndUpdate() όπως περιγράφεται σε αυτή τη σελίδα του MSDN;

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-08-2012, 15:45 71055 σε απάντηση της 71054

    Απ: αργό listview

    George J. Capnias:

    Δοκίμασες τα BeginUpdate()/EndUpdate() όπως περιγράφεται σε αυτή τη σελίδα του MSDN;

    George J.

     

    Να σου πω το δικίμασα.

    Εκανε περίπου 9 δευτερόλεπτα να γεμίσω 13942 εγγραφές και τώρα κάνει περίπου 5 δευτερόλεπτα.

    Υπάρχει κάτι καλύτερο ;

  •  07-08-2012, 15:56 71056 σε απάντηση της 71055

    Απ: αργό listview

    Χρησιμοποίησε το listview σε VirtualMode.
    Κάθε φορά (σε κάθε scroll) κάνεις retrieve άμεσα το πολύ 30-40 γραμμές.
    Μπορείς να τα φέρνεις από τη βάση η να τα κάνεις cache σε κάποιο collection
  •  07-08-2012, 17:42 71058 σε απάντηση της 71056

    Απ: αργό listview

    Προσπάθησα να το κάνω αλλά κάπου κόλλησα με το virtualMode

  •  07-08-2012, 18:39 71059 σε απάντηση της 71058

    Απ: αργό listview

    Λογικά από τη βάση τα τραβάς γρήγορα. Η καθυστέρηση είναι στην προσθήκη στο 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]
  •  07-08-2012, 21:55 71061 σε απάντηση της 71059

    Απ: αργό listview

    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]

     

    κάποια εξήγηση για αυτό το τελευταίο;

    Edit : Αντί για List<> το DataTable που έχεις ήδη.
    e.Item =litem; // litem =... dt.Row[e.ItemIndex]ω
  •  07-08-2012, 22:36 71062 σε απάντηση της 71061

    Απ: αργό listview

    Θα γεμίσεις το DataTable πρώτα.
    Στο  RetrieveVirtualItem event του listview θα εμφανίζεις τις αντίστοιχες γραμμές του DataTable. 
    Το VirtualListSize  να είναι ίσο με τον αριθμό τον εγγραφών (listView1.VirtualListSize = dt.Rows.Count).
            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;
            }

          
  •  08-08-2012, 10:56 71063 σε απάντηση της 71062

    Απ: αργό listview

    ΟΚ,

    σε ευχαριστώ.

    Δουλευει μια χαρα και σφαίρα!!!

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems