2012-04-28 12 views
18

मुझे पता चला कि TreeView.BeginUpdate जोड़कर वृक्षदृश्य की झटके को रोक देगा, लेकिन जब मैंने इसे अपने प्रोजेक्ट में जोड़ा तो मेरे वृक्षदृश्य के सभी नोड गायब हो जाते हैं, क्या कोई शरीर मुझे बता सकता है कि ऐसा क्यों होता है, यहां कोड स्निपेट है जहां मैं प्रयुक्त TreeView.BeginUpdate और TreeView.EndUpdateवृक्षदृश्य झिलमिलाहट?

TreeNode treeNode = new TreeNode("Windows"); 
     treeView1.Nodes.Add(treeNode); 
     // 
     // Another node following the first node. 
     // 
     treeNode = new TreeNode("Linux"); 
     treeView1.Nodes.Add(treeNode); 
     // 
     // Create two child nodes and put them in an array. 
     // ... Add the third node, and specify these as its children. 
     // 
     TreeNode node2 = new TreeNode("C#"); 
     TreeNode node3 = new TreeNode("VB.NET"); 
     TreeNode[] array = new TreeNode[] { node2, node3 }; 
     // 
     // Final node. 
     // 
     treeNode = new TreeNode("Dot Net Perls", array); 
     treeView1.Nodes.Add(treeNode); 
+6

पहले एक सही नहीं लगता है कि - आप 'एक पाश के भीतर कर रहे हैं BeginUpdate' /' EndUpdate' - और बदतर, 'EndUpdate' कुछ सशर्त कोड के अंदर नेस्टेड रहा है - मैं सामान्य रूप से करने के लिए उम्मीद थी संदिग्ध कोड के बावजूद –

+0

अपडेट के पूरे सेट के चारों ओर अपडेट किए गए दृश्य अपडेट को दबाए रखने वाले कुछ दृश्यों को दबाएं, ऐसा लगता है कि आप समस्या के लक्षण का समाधान करने की कोशिश कर रहे हैं। क्या असली सवाल है कि आप पहली जगह क्यों झटकेदार हो गए? या कोई झिलमिलाहट नहीं था? –

+0

अगर मैं नोड्स के अतिरिक्त से ऊपर उपयोग करता हूं तो मेरा मतलब है (.Nodes.Add) क्या वह पर्याप्त होगा ?? – vettori

उत्तर

60

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

यह शायद आपकी समस्या को हल करने के लिए पर्याप्त होगा। लेकिन आप इसे बेहतर बना सकते हैं, फ्लिकर को दबाकर डबल-बफरिंग की आवश्यकता होती है। .NET TreeView क्लास DoubleBuffered प्रॉपर्टी को ओवरराइड करता है और छिपाता है। जो एक ऐतिहासिक दुर्घटना है, मूल विंडोज नियंत्रण केवल विंडोज एक्सपी और बाद में डबल बफरिंग का समर्थन करता है। .NET ने एक बार विंडोज 2000 और विंडोज 98 का ​​समर्थन किया।

यह आजकल बिल्कुल प्रासंगिक नहीं है। आप TreeView से अपनी कक्षा प्राप्त करके इसे वापस रख सकते हैं। अपनी परियोजना में एक नई कक्षा जोड़ें और नीचे दिखाए गए कोड पेस्ट करें। संकलित करें। मौजूदा ट्री व्यू को बदलकर, टूलबॉक्स के शीर्ष से नया नियंत्रण अपने फॉर्म पर छोड़ दें। प्रभाव बहुत ध्यान देने योग्य है, खासकर जब स्क्रॉलिंग।

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

class BufferedTreeView : TreeView { 
    protected override void OnHandleCreated(EventArgs e) { 
     SendMessage(this.Handle, TVM_SETEXTENDEDSTYLE, (IntPtr)TVS_EX_DOUBLEBUFFER, (IntPtr)TVS_EX_DOUBLEBUFFER); 
     base.OnHandleCreated(e); 
    } 
    // Pinvoke: 
    private const int TVM_SETEXTENDEDSTYLE = 0x1100 + 44; 
    private const int TVM_GETEXTENDEDSTYLE = 0x1100 + 45; 
    private const int TVS_EX_DOUBLEBUFFER = 0x0004; 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
} 
+5

एमएसडीएन सुझाव देता है कि टीवीएम_SETEXTENDEDSTYLE का आपका उपयोग बिल्कुल सही नहीं है; प्रति http://msdn.microsoft.com/en-us/library/windows/desktop/bb773744(v=vs.85).aspx WPARAM एक मुखौटा है और LPARAM ध्वज है। तो पुरानी शैली प्राप्त करना छोड़ें और केवल SendMessage (यह। हैंडल, टीवीएम_SETEXTENDEDSTYLE, (IntPtr) TVS_EX_DOUBLEBUFFER, (IntPtr) TVS_EX_DOUBLEBUFFER); – EricLaw

+0

उह, वास्तव में। मैं एमएसडीएन लाइब्रेरी की एक पुरानी प्रति का उपयोग कर रहा हूं जो यह गलत दस्तावेज करता है। सही के लिए धन्यवाद! –

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