2009-10-27 19 views
8

मैं इस तरह एक DataGridView में मेरी पंक्तियों पेंटिंग कर रहा हूँ प्रतिपादन ऑनपेंट या कुछ .. क्योंकि ऑनपेंट को अक्सर बुलाया जाता है।सी # WinForms DataGridView पृष्ठभूमि रंग बहुत धीमी गति से

प्रश्न: प्रत्येक पंक्ति की पृष्ठभूमि बदलने के लिए लगभग 100 - 200 एमएस क्यों लगता है? प्रारंभ में, मैं सेलपेंट कर रहा था .. लेकिन मुझे रीफ्रेशिंग के साथ स्क्रॉल करते समय समस्याएं थीं ..

+0

तुम्हारा मतलब है यह प्रति पंक्ति 100 - 200ms लेता है? यह बहुत भारी लगता है। – leppie

+0

कितने पंक्तियां? क्या आपके पास फॉर्म पर डबल-बफरिंग सेट है? क्या आपने सेलफॉर्मेटिंग ईवेंट का उपयोग करने का प्रयास किया है? – stuartd

उत्तर

10

पूरे DataGrid के रंग को एक बार में बदलने के बजाय, आपको इसे CellFormatting ईवेंट ओवरराइड करके प्रतिपादन का प्रबंधन करना चाहिए। पंक्तियों को केवल तभी चित्रित किया जाएगा जब वे वास्तव में स्क्रीन पर प्रदर्शित होते हैं।

private void aufgabenDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex]; 
    AufgabeStatus status = (AufgabeStatus) Enum.Parse(typeof(AufgabeStatus), (string) row.Cells["StatusColumn"].Value); 

    switch (status) 
    { 
    case (AufgabeStatus.NotStarted): 
     e.CellStyle.BackColor = Color.LightCyan; 
     break; 
    case (AufgabeStatus.InProgress): 
     e.CellStyle.BackColor = Color.LemonChiffon; 
     break; 
    case (AufgabeStatus.Completed): 
     e.CellStyle.BackColor = Color.PaleGreen; 
     break; 
    case (AufgabeStatus.Deferred): 
     e.CellStyle.BackColor = Color.LightPink; 
     break; 
    default: 
     e.CellStyle.BackColor = Color.White; 
     break; 
    } 

} 

यह अभी भी बहुत धीमी है, तो वास्तविक वस्तु पंक्ति के लिए बाध्य है हो रही है कोशिश:

... 
DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex]; 
var aufgabe = (Aufgabe) row.DataBoundItem; 
AufgabeStatus status = aufgabe.Status; 
... 
+0

अच्छा, यह समाधान निर्बाध रूप से काम करता है। –

+0

यह सबूत हो सकता है कि मैं स्वयं चित्रकला को संभालने में सक्षम नहीं हूं लेकिन मुझे एमएस द्वारा प्रदान की गई तंत्र पर भरोसा करना चाहिए। अब सभी पंक्तियों को तुरंत याद किया जाता है! –

+0

और मैंने उस एनम को हटा दिया।ShdevMan –

2

शायद यह Enum.Parse कॉल है, इसका खराब प्रदर्शन है। यह देखने के लिए कि क्या यह प्रदर्शन में सुधार करता है, आपको इसे एक शब्दकोश लुकअप में देखना और बदलना चाहिए। यह post

+0

आप सही हैं, कि Enum.Parse पर्याप्त धीमी है। मैं सीधे DataBoundItem तक पहुंचता हूं। –

2

जैसा कि SwDevMan1 ने कहा था, आपको पहले Enum.Parse कॉल को हटाने पर काम करना चाहिए। क्या आप ग्रिड को पॉप्युलेट करने के लिए बाध्यकारी डेटा का उपयोग कर रहे हैं? यदि ऐसा है, तो आप पंक्तियों के लिए डेटा बाउंड ऑब्जेक्ट तक पहुंचने के लिए पंक्तियों [अनुक्रमणिका] का उपयोग कर सकते हैं। DataBoundItem और AufgabeStatus स्थिति को सीधे एक्सेस करें।

दूसरा ट्विक मैं सुझाव दूंगा कि क्रमशः पहले और बाद में, ग्रिड में हेरफेर करने के लिए SuspendLayout() और ResumeLayout() को कॉल करना है।

+0

मैंने पार्स कॉल हटा दिया। हाँ मैं डेटाबाउंडिंग का उपयोग कर रहा हूँ। मैंने डेटाबाउंड इटैम के माध्यम से सीधे तत्व का उपयोग किया। मैंने सस्पेंड और फिर से शुरू करने की कोशिश की। यह तेज़ है .. लेकिन 15 पंक्तियां अभी भी 400 मिमी में रंगी हुई हैं .. –

2

यह भी एक अच्छा विचार केवल गुणों को सेट करने में यदि वे उम्मीद मान से अलग है। इस तरह आप अवांछित आंतरिक डेटाग्रिड व्यू ओवरहेड को ट्रिगर नहीं करते हैं।

यदि पंक्ति में सभी कोशिकाओं को उसी तरह स्वरूपित किया गया है, तो आप सेल स्तर की बजाय पंक्ति स्तर पर स्वरूपण कर सकते हैं।

DataGridViewCellStyle rowStyle = row.DefaultCellStyle; 
if (rowStyle.BackColor != status.BackColor) { 
    rowStyle.BackColor = status.BackColor; 
} 
0

पंक्ति प्रारूप कोशिश मत करो row.defaultcellstyle रूप

व्यक्ति सेल ufgabenDataGridView_CellFormatting

में स्वरूपण कोशिश

सेल [0] .style.backcolor = color.yellow

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