2011-12-20 22 views
5

में बहुत धीमी गति से मैं सूची दृश्य नियंत्रण में आइटम जोड़ना चाहता हूं। यह कोड का थोड़ा सा है:सूची में आइटम जोड़ना CV

this.lView.ListViewItemSorter = null; 
    ListViewItem[] lvitems = new ListViewItem[ListMyObjects.Count]; 
    int index = 0; 
    foreach (MyObject object in ListMyObjects) 
     { 
      ListViewItem item = new ListViewItem();    
      item.Text = object.Name; 
      lvitems[index++] = item; 
     } 
    this.lView.BeginUpdate(); 
    this.lView.Items.AddRange(lvitems); // Slow in here with debugger 
    this.lView.EndUpdate(); 

मैं केवल 1000 आइटम जोड़ता हूं लेकिन यह बहुत धीमा है। यह खत्म करने के लिए लगभग 15secs खर्च है। किसी को कारण क्यों पता है? अग्रिम धन्यवाद।

संपादित:

मैंने पहले सूचीदृश्य अनुकूलित है।

public partial class MyListView: ListView 
{   
    public MyListView() 
    { 
     InitializeComponent(); 
     this.View = View.Details; 
     this.FullRowSelect = true; 
     this.DoubleBuffered = true; 
    } 
    private bool mCreating; 
    private bool mReadOnly; 
    protected override void OnHandleCreated(EventArgs e) 
    { 
     mCreating = true; 
     base.OnHandleCreated(e); 
     mCreating = false; 
    } 
    public bool ReadOnly 
    { 
     get { return mReadOnly; } 
     set { mReadOnly = value; } 
    } 
    protected override void OnItemCheck(ItemCheckEventArgs e) 
    { 
     if (!mCreating && mReadOnly) e.NewValue = e.CurrentValue; 
     base.OnItemCheck(e); 
    } 
} 

मैं ऐसा इसलिए करता हूं क्योंकि जब मैं एकाधिक थ्रेडिंग का उपयोग करता हूं तो मैं लटकना नहीं चाहता हूं। मुझे नहीं पता कि इससे क्या प्रभावित होता है?

+1

धीमी गति कौन सी रेखा है? (डीबगर का उपयोग करें) – SLaks

+0

मैंने सोचा था ... – SLaks

+1

मैंने इसे पूर्णांक मानों के साथ करने की कोशिश की, और यह स्वीकार्य गति के साथ काम करता है। (<2seconds)। शायद यह आपकी वस्तुओं से संबंधित है? की – Matthias

उत्तर

3

आप यह बहुत virtual mode को सक्षम करने से तेजी से बना सकते हैं।
हालांकि, यह कुछ काम करेगा।

+0

क्या आप जानते हैं क्या उस व्यवहार का कारण? जैसा कि मैंने इस सवाल पर टिप्पणी की, यह पूर्णांक के लिए अच्छी तरह से काम करता है। – Matthias

+0

@ स्लक्स, फोरच लूप के अंदर चलाने के लिए कचरा कलेक्टर बल। मुझे लगता है कि जीसी स्वचालित रूप से चलाने से पहले स्मृति में बहुत सारी वस्तुएं हैं। आपको कोड की इन पंक्तियों को जोड़ने की आवश्यकता हो सकती है: जीसी। कोलेक्ट(); GC.WaitForPendingFinalizers(); –

+0

@ बिशनू पॉडेल: वह बिल्कुल भी अच्छा नहीं करेगा; लूप में इकट्ठा करने के लिए कुछ भी नहीं है। – SLaks

3

से अधिक आइटम जोड़ने का पसंदीदा तरीका AddRange() method उपयोग करने के लिए है। हालांकि यदि आपको आइटम एक-एक करके जोड़ना है तो आप अपने लूप के आस-पास BeginUpdate() और एंडअपडेट() विधियों का उपयोग कर सकते हैं। बाद MSDN

से एक ListView से अधिक आइटम जोड़ने के लिए पसंदीदा तरीका ListView.ListViewItemCollection (ListView के आइटम संपत्ति के माध्यम से पहुँचा) की AddRange विधि का उपयोग करने के लिए है है। यह आपको एक ही ऑपरेशन में सूची में आइटमों की एक सरणी जोड़ने में सक्षम बनाता है। हालांकि, यदि आप ListView.ListViewItemCollection क्लास की ऐड विधि का उपयोग करके एक बार आइटम जोड़ना चाहते हैं, तो आप आइटम को जोड़े जाने पर प्रत्येक बार ListView को पुनर्स्थापित करने से नियंत्रण को रोकने के लिए BeginUpdate विधि का उपयोग कर सकते हैं।

0

अधिक आर्किटेक्चरल समाधान के लिए ऐपोलॉजीज, लेकिन यदि आपकी डोमेन ऑब्जेक्ट्स बड़ी हैं तो यह बाधा उत्पन्न कर सकती है (टिप्पणियां पढ़ने से लगता है जैसे वे इसे धीमा कर सकते हैं)। प्रस्तुति परत तक पहुंचने से पहले आप उन्हें कुछ (बहुत ही सरल) डोमेन ट्रांसफर ऑब्जेक्ट्स (डीटीओ) में फटकार सकते हैं: सचमुच केवल गेटर्स-एंड-सेटर्स का एक बैग।

AutoMapper की तरह एक उपकरण संभावित गधा का एक बहुत ले सकता है वहाँ बाहर काम

इस तरह आपके डोमेन वस्तुओं व्यापार तर्क डोमेन (जहां वे संबंधित) में रहने और अपनी प्रस्तुति परत बस से जरूरतों में डेटा हो जाता है डीटीओ

गैर कोड आधारित सुझाव :) अच्छे भाग्य के लिए खेद है!

+0

क्या आप कृपया बता सकते हैं कि "बड़ी" ऑब्जेक्ट्स आपके डीटीओ (= [POCO's | http: //en.wikipedia.org/wiki/Plain_Old_CLR_Object) से अलग कैसे हैं?गुण संदर्भों का सिर्फ एक गुच्छा हैं? – toong

+0

रेंट: तो टिप्पणी प्रणाली में कोई पूर्वावलोकन नहीं है और मुझे अपनी खुद की टिप्पणी को संपादित/ठीक करने में सक्षम होने के लिए और अधिक अंक एकत्र करने की आवश्यकता है? ये .. – toong

+0

एक डीटीओ एक निर्भर प्रणाली का समर्थन करने के लिए जितना आवश्यक डेटा भेजता है, जबकि एक पीओसीओ में अन्य डेटा का समूह भी हो सकता है। आम तौर पर एक प्रणाली के भीतर एक पीओसीओ का उपयोग किया जाता है, एक डीटीओ का उपयोग दो प्रणालियों (एक प्रणाली भौतिक इकाई या तार्किक एक) के बीच किया जाता है। उम्मीद है कि मदद करता है, खेद है कि टिप्पणी प्रणाली आपको दुःख दे रही है। –

संबंधित मुद्दे