2008-12-24 8 views
8

क्या WinForms .NET TreeView नियंत्रण में नोड्स जोड़ने का कोई आसान तरीका है जहां नए नोड्स को जोड़ा जा रहा है, सही इंडेक्स पर डाला गया है ताकि नोड्स की पूरी सूची वर्णानुक्रम में क्रमबद्ध हो? TreeView.Sort() के समान परिणाम होने के बहुत सारे हैं।स्वचालित रूप से नोड्स जोड़ने पर ट्री व्यू को क्रमबद्ध करें

मेरे पास एक वृक्ष दृश्य है जो लगातार दो सौ नोड्स तक बढ़ता है। उपयोगकर्ता इस वृक्ष दृश्य को वास्तविक समय में देख सकता है क्योंकि यह बढ़ता है। नोड जोड़े जाने के बाद हर बार TreeView.Sort() को कॉल करने के बजाय, मैं सिर्फ सही इंडेक्स पर नोड्स डालना पसंद करूंगा।

क्या यह किया जा सकता है?

उत्तर

24

Winforms में, आप बस TreeView की .Sorted संपत्ति True पर सेट कर सकते हैं।

छाँटे सही पर सेट किया जाता है, तो TreeNode वस्तुओं उनके पाठ संपत्ति मूल्यों से वर्णमाला के क्रम में हल कर रहे हैं। वृक्ष दृश्य आइटम की मात्रा को क्रमबद्ध करते समय प्रदर्शन को बनाए रखने के लिए आपको BeginUpdate और EndUpdate का उपयोग करना चाहिए। जब मौजूदा नोड का टेक्स्ट बदल जाता है, तो आपको आइटम को रिसॉर्ट करने के लिए सॉर्ट करना होगा।

रेफरी MSDN

+8

दिलचस्प रूप से पर्याप्त (मेरे लिए कम से कम) यह है कि .orted संपत्ति वृक्ष दृश्य के लिए वीएस संपत्ति सूची में दिखाई नहीं देती है और न ही इंटेलिसेंस में। शायद यह एक निरीक्षण है। जैसा कि आपने बताया है, एमएसडीएन दस्तावेज़, स्पष्ट रूप से इसका उल्लेख करते हैं लेकिन कई बार मैं गुणों तक पहुंचने के लिए "डॉट कुंजी दबाता हूं" और फिर यदि मैं नहीं देख पा रहा हूं तो दस्तावेज़ों को चेक आउट करें। मैंने शुरू में अनदेखा किया कि संपत्ति को क्रमबद्ध किया गया और यह निश्चित रूप से सूची को क्रमबद्ध करने की दक्षता में एक अंतर बना। यह सेट करने के लिए बहुत तेज था।क्रमशः कॉल() के बाद कॉल से सच में क्रमबद्ध करें। – itsmatt

+1

मेरे लिए यह गुण सूची में भी दिखाई नहीं देता है, लेकिन मैन्युअल रूप से कोडिंग भी काम करता है - tree.Sorted = true –

+2

http://msdn.microsoft.com/en-us/library/system.windows.forms का उपयोग करें। यदि आप सॉर्टर सेट करना चाहते हैं तो treeview.treeviewnodesorter.aspx –

5

आप TreeView और TreeNodeCollection से प्राप्त होने वाले नए वर्ग क्यों नहीं बनाते? नया TreeView आपके नए TreeNodeCollection का उपयोग करेगा और आप जो भी सुझाव दे रहे हैं, उसके लिए TreeNodeCollection की Add() विधि को ओवरराइड कर सकते हैं।

विधि को यह करना होगा: 1. डालने के लिए सही स्थिति खोजें और 2. नया नोड डालें।

सबसे छोटा कार्यान्वयन thisNode.value<=newNode.value<nextNode.value तक संग्रह के माध्यम से फिर से शुरू होगा। फिर nextNode.Index से पहले डालें। यदि आप संग्रह के आकार के आधार पर एक अलग खोज एल्गोरिदम का उपयोग करते हैं तो आप प्रदर्शन वृद्धि देख सकते हैं। (बाइनरी खोज की तरह कुछ दिमाग में आता है।)

नोट: आप TreeNodeCollection पर एक विस्तार विधि भी बना सकते हैं जो वही काम करता है। हालांकि, Add() विधि को ओवरराइड करने से आपका TreeView हमेशा सॉर्ट किया गया है। केवल एक एक्सटेंशन विधि बनाने से अपरिभाषित परिणाम हो सकते हैं यदि यह आपके AddIntoSorted() कॉल से पहले ही सॉर्ट नहीं किया गया है।

+1

यह आसानी से के बाद से अपनी पोस्ट 6 साल की उम्र है, लेकिन जैसे आप 'TreeNodeCollection' अब उपवर्ग नहीं कर सकते हैं यह लग रहा है बदल दिया है हो सकता है। इसमें एक 'आंतरिक' पहुंच संशोधक के साथ एक निर्माता है।] (Http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeNodeCollection.cs) –

+2

@DarrenHale दिलचस्प। और कष्टप्रद, क्योंकि मुझे लगता है कि आपको पहिया को फिर से शुरू करना होगा, फिर अपना नया 'ट्री व्यू' नया संग्रह उपयोग करें। सर उठाने के लिए धन्यवाद। –

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