2010-06-10 17 views
5

मैं एक डैशबोर्ड एप्लिकेशन बना रहा हूं जो FlowLayoutPanel पर सैकड़ों "आइटम" दिखाता है।सैकड़ों कस्टम UserControls हजारों उपयोगकर्ता ऑब्जेक्ट्स बनाते हैं

प्रत्येक "आइटम" UserControl है जो 12 टेक्स्टबॉक्स या लेबल से बना है।

मेरा ऐप डेटाबेस से पूछताछ करता है और फिर प्रत्येक रिकॉर्ड के लिए "आइटम" उदाहरण बनाता है, इसे FlowLayoutPanel पर जोड़ने से पहले डेटा के साथ लेबल और टेक्स्टबॉक्स को पॉप्युलेट करता है।

पैनल में लगभग 560 आइटम जोड़ने के बाद, मैंने देखा कि USER Objects मेरे टास्क मैनेजर में गिनती लगभग 7300 तक बढ़ गई थी, जो मेरी मशीन पर किसी अन्य ऐप से कहीं अधिक बड़ी थी।

मैं लगा 560 * 13 (12 लेबल प्लस UserControl ही) 7280 ताकि अचानक दूर दे दी है जहां सभी वस्तुओं को जानने से पहले एक 10,000 उपयोगकर्ता वस्तु सीमा है से ...

आ रहे थे यह है कि खिड़कियां तौलिया में फेंकता है, मैं इन "वस्तुओं" को FlowLayoutPanel पर खींचने के बेहतर तरीके खोजने की कोशिश कर रहा हूं। "आइटम"

  1. उपयोगकर्ता-आकर्षित, लेबल के कई के स्थान पर graphics.DrawText और DrawImage का उपयोग कर:

    मेरे विचारों अब तक इस प्रकार हैं। मैं आशा करती हूं कि यह 1 आइटम = 1 USER Object, नहीं 13.

  2. "आइटम", तो प्रत्येक रिकॉर्ड के लिए, उदाहरण के पॉप्युलेट और एक छवि हड़पने के लिए Control.DrawToBitmap() विधि का उपयोग करें और उसके बाद की 1 उदाहरण है मतलब होगा का उपयोग करें कि में FlowLayoutPanel (या इसी तरह)

तो ... किसी को भी किसी भी अन्य सुझाव हैं ???

पीएस यह एक ज़ूम करने योग्य इंटरफ़ेस है, इसलिए मैंने पहले से ही "पेजिंग" से इंकार कर दिया है क्योंकि सभी आइटम एक बार

उत्तर

2

कम से कम, मैं आपके विचार # 1 से शुरू करूंगा। इससे वास्तव में आपके एप्लिकेशन को 13 के कारक द्वारा गोद लेने वाली खिड़कियों की संख्या कम हो जाएगी।

आपके विचार # 2 के संबंध में, यह वास्तव में आपकी मदद नहीं करेगा यदि आप बिटमैप को पिक्चरबॉक्स (या जो कुछ भी) में डालते हैं और इस प्रकार आपके फॉर्म पर बड़ी संख्या में पिक्चरबॉक्स नियंत्रण होते हैं (यह भी हो सकता है खराब, चूंकि बिटमैप्स कभी-कभी सामान्य रैम की तुलना में अधिक सीमित संसाधन से बना होता है, जो कि बहुत सारी खिड़कियों को लेने से पूरी तरह से अलग समस्या है)। यह केवल एक अच्छा विचार होगा यदि आप परिणामी बिटमैप्स ले रहे थे और उन्हें एक बड़े नियंत्रण (और फिर बिटमैप्स का निपटान) पर कॉपी कर रहे थे।

यदि आप यह बाद का दृष्टिकोण लेते हैं, तो वास्तव में नियंत्रण में प्रतिपादन के मध्यवर्ती चरण का उपयोग करने, नियंत्रण की बिटमैप प्रति प्राप्त करने और फिर उस बिटमैप को अंतिम नियंत्रण पर खींचने की आवश्यकता नहीं है। यह कोड/तर्क लेने के लिए अधिक समझ में आता है जिसका उपयोग आप नियंत्रण प्रदान करने के लिए करते हैं, और इसके बजाय सीधे अंतिम (बहु-तत्व) नियंत्रण में प्रस्तुत करते हैं।

+0

सैकड़ों बिटमैप्स या चित्र बॉक्स बनाने के विरोध में, मुझे लगता है कि दृष्टिकोण प्रत्येक नियंत्रण को सीधे 'पिक्चरबॉक्स' की छवि पर आकर्षित करेगा, या एक "स्प्राइट" बिटमैप होगा और सभी नियंत्रण आकर्षित करेगा उस से। यद्यपि वे वास्तव में * बस * लेबल हैं, तो मुझे लगता है कि 'टेक्स्ट रेन्डरर' का उपयोग करना और नियंत्रण को पूरी तरह से बाईपास करना आसान है - यह कहना मुश्किल है कि यहां वास्तव में क्या खींचना है। – Aaronaught

+0

मैं उसे 'टेक्स्ट रेन्डरर' से दूर ले जाऊंगा, क्योंकि यह बहुत धीमा है ('ग्राफिक्स.ड्रास्ट्रिंग' के सापेक्ष), लेकिन अन्यथा मैं मानता हूं कि उनका सबसे अच्छा तरीका केवल प्रत्येक डेटाबेस पंक्ति को केवल एक ही नियंत्रण में प्रस्तुत करना है (और अधिमानतः केवल दृश्य पंक्तियों को प्रस्तुत करें)। – MusiGenesis

1

आपका विचार # 2 वह है जिसे मैं अनुशंसा करता हूं। यह बिल्कुल सही है कि हजारों रिकॉर्ड प्रदर्शित करने के उद्देश्य से सूची और ग्रिड नियंत्रण in-place editing करने में सक्षम हैं। आप केवल एक नियंत्रण से शुरू करते हैं, और जहां भी आपको इसकी आवश्यकता होती है वहां ले जाएं।

यदि आपको एक ही समय में कई उदाहरण प्रदर्शित करने की आवश्यकता है तो यह थोड़ा कठिन है - जैसा कि आप उल्लेख करते हैं, आपको शायद DrawToBitmap का उपयोग करना होगा और नियंत्रण की "भूत छवि" प्रदर्शित करना होगा।

वैकल्पिक रूप से, मुझे लगता है कि यहां कुछ स्क्रॉलिंग चल रही है (कोई भी वास्तव में 7280 यूआई ऑब्जेक्ट्स को एक बार में देख सकता है, है ना?), तो दूसरी चीज जो आप कर सकते हैं वह गतिशील रूप से केवल ऐसे उदाहरण बनाते हैं जो वास्तव में होने जा रहे हैं एक ही समय में स्क्रीन पर। आपको दृश्य क्षेत्र की गणना करना होगा और प्रदर्शित होने वाली नियंत्रणों की सूची के मुकाबले इसकी तुलना करना होगा, और यदि यूआई को वास्तव में कोई विवरण देने के लिए ज़ूम आउट किया गया है तो प्लेसहोल्डर प्रदर्शित करें। मुझे कल्पना है कि स्क्रॉलिंग/ज़ूमिंग एक सुंदर सीपीयू-गहन ऑपरेशन बन जाएगा यदि आपने ऐसा किया है, हालांकि; बस उन्हें बिल्कुल नहीं बनाने के लिए बेहतर है।

1

मैंने अच्छे परिणामों के साथ # 1 लागू किया है।

13x कम उपयोगकर्ता ऑब्जेक्ट्स, और यह भी तेज़ और अधिक प्रतिक्रियाशील महसूस करता है।

सुझावों के लिए धन्यवाद - मुझे आश्चर्य है कि यह एक और आम समस्या नहीं है!

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