2010-11-23 8 views
14

(बुरा अंग्रेजी के लिए खेद है)DataGridView के चित्रकला प्रदर्शन में सुधार कैसे करें?

मैं DataGridView के प्रदर्शन जब यह फिर से पेंट के साथ एक बड़ा समस्या है।

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

संदेश एकत्र करने के लिए कतार का उपयोग करना संभव है और DataGridView कतार से संदेशों के साथ प्रत्येक 100 एमएस को दोबारा पेंट करें। यह अच्छा है लेकिन DataGridView ब्लिंक करता है जब यह अंतिम पंक्ति पर स्वतः स्क्रॉल करता है। (चिकनी स्क्रॉल अक्षम है)

क्या आप DataGridView प्रदर्शन को बेहतर बनाने में मेरी सहायता कर सकते हैं?

+0

के संभावित डुप्लिकेट आयात किया जाता है।कॉम/प्रश्न/118528/भयानक-रेड्रा-प्रदर्शन-ऑफ-द-दैटग्रिडव्यू-ऑन-द-टू-द-टू-स्क्रीन) – qub1n

उत्तर

37

मैं हाल ही में DataGridView के साथ कुछ सुस्ती मुद्दों था और समाधान के लिए निम्न कोड

public static void DoubleBuffered(this DataGridView dgv, bool setting) 
{ 
    Type dgvType = dgv.GetType(); 
    PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
    pi.SetValue(dgv, setting, null); 
} 

यह DataGridView वस्तुओं के लिए पर डबल बफरिंग बदल जाता था। अपने डीजीवी पर बस DoubleBuffered() पर कॉल करें। आशा करता हूँ की ये काम करेगा।

संपादित करें: मुझे इसे बंद कर दिया गया है, लेकिन मैं अभी मूल की खोज नहीं कर सकता, इसलिए यह सिर्फ इतना ज़ोर देना है कि कोड मेरा नहीं है।

+8

आपके द्वारा पोस्ट की गई विधि 'डेटाग्रिड व्यू' नियंत्रण पर गैर-सार्वजनिक संपत्ति को बदलने के लिए प्रतिबिंब का उपयोग करती है । यह एक स्वीकार्य समाधान है, लेकिन मौजूदा 'डेटाग्रिड व्यू' नियंत्रण से वंचित होने के लिए शायद यह क्लीनर है और "डबलबफर्ड" स्टाइल सेट के साथ अपना खुद का कस्टम नियंत्रण बनाएं। –

+1

हाँ, यह मदद करता है !!! धन्यवाद – Yuriy

+0

मेरी समस्या यह है कि यदि मैं अपना नियंत्रण प्राप्त करता हूं तो संपादक में फॉर्म प्रदर्शित नहीं होगा। –

3

जब डेटा की बड़ी मात्रा के साथ काम करने, DataGridView नियंत्रण कर सकते हैं जब तक आप इसे सावधानी से उपयोग न करें, तब तक ऊपरी हिस्से में बड़ी मात्रा में स्मृति का उपभोग करें। सीमित स्मृति वाले ग्राहकों पर, आप उच्च स्मृति लागत वाले सुविधाओं से बचकर इस ओवरहेड से बच सकते हैं।

आप अपने परिदृश्य के लिए मेमोरी उपयोग को कस्टमाइज़ करने के लिए वर्चुअल मोड का उपयोग करके कुछ या सभी डेटा रखरखाव और पुनर्प्राप्ति कार्यों को भी प्रबंधित कर सकते हैं। अधिक जानकारी आप dapfor जा सकते हैं। कॉम

4

प्रतिबिंब के बिना स्वच्छ समाधान है:

public class DataGridViewDoubleBuffered : DataGridView 
{ 
    public DataGridViewDoubleBuffered() 
    { 
     DoubleBuffered = true; 
    } 
} 

फिर myForm.designer.cs के पास जाकर DataGridView से DataGridViewDoubleBuffered करने के लिए एक प्रकार बदलें।

+1

और यदि आप समाधान एक्सप्लोरर में MyForm.cs का विस्तार करते हैं, तो आप MyForm.Designer.cs खोल सकते हैं और इसे बेस क्लास के बजाय डबल buffered subclass को तुरंत चालू कर सकते हैं। – Timo

+0

इसके लिए धन्यवाद - यह रात और दिन अलग है। किसी को यह सोचने के लिए कि यह कैसे करें - इस वर्ग को अपने कोड के नीचे जोड़ें - मैंने इसे अपने फॉर्म क्लास के बाहर अपने नेमस्पेस के भीतर जोड़ा। फिर, अपने फॉर्म का 'Designer.CS' ('Form1.Designer.cs') खोलें और अनुभाग को अनदेखा करने के लिए' विंडोज फॉर्म डिज़ाइनर जेनरेट कोड 'के बगल में स्थित' + 'चिह्न पर क्लिक करें। डेटाग्रिडव्यू प्रारंभिकरण बदलें (कुछ 'this.dataGridView1 = new System.Windows.Forms.DataGridView') जैसे - इसे' this.dataGridView1 = new DataGridViewDoubleBuffered' में बदलें। फिर, नीचे की ओर स्क्रॉल करें जहां इसकी घोषणाएं हैं। – user1274820

+0

घोषणाओं को बदलें ('निजी सिस्टम। Windows.Forms.DataGridView डेटाGridView1') को 'निजी डेटाग्रिड व्यू डबल-बुक किया गया डेटा GridView1'। मैं भी आगे बढ़ गया और अपना फॉर्म डबल buffered बनाया - यह करने लायक हो सकता है - यह सुनिश्चित नहीं है कि यह आवश्यक है। – user1274820

3

मैं इस समाधान का उपयोग करता हूं और थोड़ा तय करता हूं। // stackoverflow:

प्रतिबिंब तो यह भी कोड में (http [मेरे दो स्क्रीन में से एक पर DataGridView की भयानक redraw प्रदर्शन]

using System.Reflection; 

typeof(DataGridView).InvokeMember("DoubleBuffered", 
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, 
null,this.dataGridView1,new object[] { true });