2009-02-25 13 views
5

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

Control.SuspendRedraw() 
this.doStuff() 
this.doOtherStuff() 
this.doSomeReallyCoolStuff() 
Control.ResumeRedaw() 

को नियंत्रण में बताने के लिए मैं SuspendLayout/ResumeLayout कार्यों को देखा है चाहते हैं, लेकिन वे करते हैं कुछ भी नहीं (वे आकार बदलने/चलने वाले नियंत्रणों से अधिक संबंधित प्रतीत होते हैं, न कि सिर्फ अपने डाटावालों को संपादित करते हैं?)

+0

के संभावित डुप्लिकेट होगा Win32 संदेश है और उसके बच्चे?] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

देखें http://stackoverflow.com/ प्रश्न/487,661/कैसे करते हैं-ए-निलंबित-पेंटिंग के लिए एक-विवाद एल-एंड-इसके-बच्चे – Simon

उत्तर

8

चीजें हैं जो आप कोशिश कर सकते हैं के एक जोड़े हैं। यह वास्तविक डेटाग्रिड व्यू उदाहरण पर प्रॉपर्टी है, फॉर्म नहीं। यह एक संरक्षित संपत्ति है, इसलिए आपको इसे सेट करने के लिए अपने ग्रिड को उप-वर्ग करना होगा।

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

मैं छोटे ड्रा बहुत-से अपडेट देखा है कुछ वीडियो कार्ड पर DataGridView के साथ कुछ समय ले, और यह उन्हें batching इससे पहले कि वे प्रदर्शन के लिए बंद भेजा जाता है से आपकी समस्या का समाधान हो सकता है।


एक और बात तुम कोशिश कर सकते [कैसे मैं एक नियंत्रण के लिए पेंटिंग को निलंबित करते WM_SETREDRAW

// ... this would be defined in some reasonable location ... 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(HandleRef hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 

static void EnableRepaint(HandleRef handle, bool enable) 
{ 
    const int WM_SETREDRAW = 0x000B; 
    SendMessage(handle, WM_SETREDRAW, new IntPtr(enable ? 1 : 0), IntPtr.Zero); 
} 

अपने कोड में कहीं आप

HandleRef gh = new HandleRef(this.Grid, this.Grid.Handle); 
EnableRepaint(gh, false); 
try 
{ 
    this.doStuff(); 
    this.doOtherStuff(); 
    this.doSomeReallyCoolStuff(); 
} 
finally 
{ 
    EnableRepaint(gh, true); 
    this.Grid.Invalidate(); // we need at least one repaint to happen... 
} 
0

आप डबलबफर का उपयोग करने के लिए फॉर्म सेट करने का प्रयास कर सकते हैं। फॉर्म को सेट करें। डबलबफर संपत्ति सत्य पर, और इससे आपकी समस्या हल होनी चाहिए।

सबसे पहले, सही करने के लिए DataGridView की DoubleBuffer संपत्ति सेट करने का प्रयास:

+0

यह थोड़ी सी चीज को फिर से निकाल देता है, लेकिन आप अभी भी प्रत्येक बॉक्स को खींचा जा सकता है। – GWLlosa

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