2013-01-03 22 views
6

के साथ StackOverflowException यह एक विषम है। मेरे पास DataGridView है। मैं DataSource को List के साथ अपनी खुद की कस्टम क्लास की ऑब्जेक्ट्स सेट कर रहा हूं। सूची में लगभग 50,000 आइटम हैं। मैंने उन सभी कॉलम को परिभाषित किया जिन्हें मैं डिजाइनर में दिखाना चाहता था और AutoGenerateColumns को झूठी में सेट करना चाहता था।डेटाग्रिड व्यू

जैसे ही मैं अपनी सूची में DataSource सेट करता हूं, यह तुरंत सही ढंग से आबादी में आता है। मैं ऊपर और नीचे स्क्रॉल कर सकते हैं, विभिन्न पंक्तियों का चयन करें। सबकुछ ठीक है। लेकिन जब मैं जिस तरह के सभी नीचे स्क्रॉल करें और उसके बाद युक्त DataGridView खो ध्यान केंद्रित सब कुछ जम जाता है और एक छोटे से बाद ढेर जैसे overflows, जबकि खिड़की करते हैं:

System.Drawing.dll!System.Drawing.SafeNativeMethods.Gdip.GdipDeleteGraphics(System.Runtime.InteropServices.HandleRef graphics) + 0x2a bytes 
    System.Drawing.dll!System.Drawing.Graphics.Dispose(bool disposing) + 0x56 bytes 
    System.Drawing.dll!System.Drawing.Graphics.Dispose() + 0x12 bytes 
    System.Drawing.dll!System.Drawing.Font.GetHeight() + 0xc8 bytes 
    System.Drawing.dll!System.Drawing.Font.Height.get() + 0xb bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRow() + 0x44 bytes  
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.Clone() + 0x44 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRowCollection.this[int].get(int index) + 0xa8 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridView.DataGridViewAccessibleObject.GetChild(int index) + 0xbd bytes  
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x76 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() + 0x83 bytes 
    ... 

किसी कारण DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get() विधि में ही बुला रहा है के लिए गुमनामी। पूरा ढेर मेरे लिए अजीब लगता है। Font.Height.get() कभी भी DataGridViewRow पर कॉल क्यों करेगा?

संपादित करें:

मुझे कुछ कोड के लिए कहा गया था। यह डिजाइनर DataGridView और उसके स्तंभों के लिए कोड जेनरेट किया गया है:

// 
    // dataGridView 
    // 
    this.dataGridView.AllowUserToAddRows = false; 
    this.dataGridView.AllowUserToDeleteRows = false; 
    this.dataGridView.AllowUserToOrderColumns = true; 
    this.dataGridView.AllowUserToResizeRows = false; 
    this.dataGridView.BackgroundColor = System.Drawing.SystemColors.Window; 
    this.dataGridView.BorderStyle = System.Windows.Forms.BorderStyle.None; 
    this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
    this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
    this.Date, 
    this.Type, 
    this.Job, 
    this.Mix, 
    this.Entry}); 
    this.dataGridView.Location = new System.Drawing.Point(8, 96); 
    this.dataGridView.Name = "dataGridView"; 
    this.dataGridView.ReadOnly = true; 
    this.dataGridView.RowHeadersVisible = false; 
    this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 
    this.dataGridView.Size = new System.Drawing.Size(1152, 504); 
    this.dataGridView.TabIndex = 10; 
    this.dataGridView.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged); 
    // 
    // Date 
    // 
    this.Date.DataPropertyName = "FormattedTime"; 
    this.Date.HeaderText = "Date/Time"; 
    this.Date.Name = "Date"; 
    this.Date.ReadOnly = true; 
    // 
    // Type 
    // 
    this.Type.DataPropertyName = "FormattedType"; 
    this.Type.FillWeight = 60F; 
    this.Type.HeaderText = "Type"; 
    this.Type.Name = "Type"; 
    this.Type.ReadOnly = true; 
    this.Type.Width = 60; 
    // 
    // Job 
    // 
    this.Job.DataPropertyName = "Job"; 
    this.Job.FillWeight = 80F; 
    this.Job.HeaderText = "Job No."; 
    this.Job.Name = "Job"; 
    this.Job.ReadOnly = true; 
    this.Job.Width = 80; 
    // 
    // Mix 
    // 
    this.Mix.DataPropertyName = "Mix"; 
    this.Mix.FillWeight = 80F; 
    this.Mix.HeaderText = "Mix No."; 
    this.Mix.Name = "Mix"; 
    this.Mix.ReadOnly = true; 
    this.Mix.Width = 80; 
    // 
    // Entry 
    // 
    this.Entry.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; 
    this.Entry.DataPropertyName = "FormattedSummary"; 
    this.Entry.HeaderText = "Entry"; 
    this.Entry.Name = "Entry"; 
    this.Entry.ReadOnly = true; 

जब समय ग्रिड दृश्य को भरने के लिए चारों ओर आता है, मैं बस एक कार्य करें:

dataGridView.DataSource = myList; 
+0

क्या क्या आपका कोड है? –

+0

मैंने कुछ प्रश्न के साथ अपना प्रश्न अपडेट कर लिया है। धन्यवाद। –

उत्तर

8

फिक्स

कोई ठीक इस समय में जाना जाता है ।

वर्कअराउंड

नियंत्रण कक्ष में सेवाएं पैनल से टेबलेट पीसी इनपुट सेवा (यानी tabtip.exe) अक्षम करना।

विवरण

कुछ सप्ताह पहले मैं इस मुद्दे के बारे Microsoft डेवलपर सहायता से संपर्क किया। मैं WinForms टीम पर एक समर्थन इंजीनियर साथ पत्राचार किया और हम पता लगा कि इस समस्या से Accessibility.dll वजह से किसी तरह था अपने आवेदन में लोड किया जा रहा है जब भी माइक्रोसॉफ्ट के टेबलेट पीसी इनपुट सेवा (tabtip.exe) चल रहा था। यह सेवा कम से कम सभी विंडोज 7 एंटरप्राइज़ इंस्टॉलेशन पर मौजूद है लेकिन आमतौर पर केवल तभी चलती है जब आपके पास टैबलेट पीसी हो या आपने कभी भी अपने पीसी पर किसी भी तरह का पेन इनपुट डिवाइस इंस्टॉल किया हो। मैंने अतीत में अपने पीसी पर एक वाकॉम बांस पेन टैबलेट का इस्तेमाल किया था, इसलिए यह समझ में आया कि यह सेवा क्यों चल रही थी। ध्यान दें कि यह निर्धारित किया गया था कि न तो जिस विधि को मैंने DataGridView को पॉप्युलेट करने के लिए उपयोग किया था और न ही मेरे द्वारा सेट की गई किसी भी संपत्ति को इस मुद्दे से कोई लेना देना था।

Accessibility.dll किसी Microsoft पुस्तकालय है कि कुछ बाह्य उपकरणों (पेन टैबलेट और विशेष रूप से सहायक उपकरणों) और अधिक आसानी से बातचीत और रूपों और रूपों पर निहित नियंत्रण के बारे में अतिरिक्त जानकारी प्राप्त करने की अनुमति देता है। मैं इस पर 100% निश्चित नहीं हूं लेकिन मेरा मानना ​​है कि इस लाइब्रेरी को स्वचालित रूप से स्थापित होने पर प्रत्येक चलती विंडोज प्रक्रिया में लोड किया जाता है।

एक डंप है कि मैं मुहैया कराई थी परीक्षण करने के बाद, माइक्रोसॉफ्ट इंजीनियर कोड रास्ता है कि DataGridView नीचे जाने का फैसला किया और पाया कि Accessibility.dll अपराधी की अनुमति दी है कि यह होने दें था हैरान था। उन्होंने स्वीकार किया कि DataGridView ऐसा नहीं करना चाहिए और यह उनके अंत में एक समस्या की तरह लग रहा था। हालांकि, वह अपने पीसी और एक ताजा विंडोज 7 वीएम पर टैबलेट पीसी इनपुट सेवा चालू करने के बाद भी अपने अंत में समस्या को पुन: पेश करने में असमर्थ था। इसलिए जब वह अपने पीसी पर समस्या का कारण बनने वाले प्रमुख खिलाड़ियों की पहचान करने में सक्षम था, तो वह मूल कारण नहीं ढूंढ पाए और इसलिए आगे बढ़ने में असमर्थ रहे।

यह मेरे विशेष कलम टैबलेट डिवाइस (वाकॉम) या किसी अन्य चीज़ को एक साथ जिम्मेदार ठहराया जा सकता है। यह अज्ञात है। अगर किसी और को इस समस्या का सामना करना पड़ता है, तो कृपया मुझसे संपर्क करें। इंजीनियर ने मुझे उससे संपर्क करने के लिए आमंत्रित किया अगर मैं कभी भी कारण को कम करने में सक्षम था। अभी के लिए, केवल सेवा को बंद रखने से समस्या को रोकता है।

+0

एक दिन से अगले दिन तक मुझे मुफ्त LogExpert एप्लिकेशन के नियमित क्रैश होने लगे, और इस मुद्दे पर इसका पता लगाया। मुझे लगता है कि मेरी मशीन पर टैबलेट पीसी इनपुट सेवा को सक्षम करने के लिए कुछ ट्रिगर हुआ (शायद मेरे फोन में प्लगिंग? मैंने कलम-आधारित डिवाइस को कभी नहीं जोड़ा है)। –

0

मैं पूरी तरह से उर promblem समझ में नहीं कर रहा हूँ लेकिन मुझे लगता है कि उर समस्या DataGridView और स्मृति के सुस्ती है

मैं एक समाधान है: 1: केवल की तरह पन्नों में तोड़ DataGridView पंक्ति DataGridView में अधिकतम 100 पंक्ति और में अगले hundread दिखाने लेकिन टन या अन्य नियंत्रण यह उर वीडियो स्मृति कम करने में मदद क्लिक 2: DataGridView से 3 पर डबल Buffred सक्षम करें: उपयोग Suspendlayout और फिर से शुरू लेआउट समारोह आसानी से आइटम आकर्षित करने के लिए

1

मुझे डेटाग्रिड व्यू में स्टैक ओवरफ्लो एक्सेप्शन का एक बहुत ही समान परिदृश्य सामने आया है।

शर्तें:

  1. एक WinForm एक DataGridView नियंत्रण की मेजबानी। DataGridView गुण केवल पढ़ने के लिए और वर्चुअल मोड सही पर सेट है।
  2. VirtualMode के MSFT प्रलेखन प्रति (http://msdn.microsoft.com/en-us/library/2b177d6d.aspx)
  3. लोड डेटा का एक बड़ा राशि (15 कॉलम एक्स 1 x 10^5 पंक्तियाँ)
  4. DataGridView का व्यवहार सामान्य है के रूप में लागू OnCellValueNeeded (यानी: जीयूआई की प्रतिक्रिया, पंक्ति और सेल चयन, लंबवत & क्षैतिज स्क्रॉलिंग) यदि केवल 10 कॉलम एक्स 30 पंक्तियों [300 कोशिकाओं] प्रदर्शित करते हैं। जब मैं डिस्प्ले को अधिकतम करता हूं जैसे कि प्रदर्शित कोशिकाओं की संख्या बहुत बड़ी होती है, तो डेटाग्रिड व्यू में स्टैक ओवरव्लो एक्सेप्शन निकाल दिया जाता है।
  5. मेरे पास भी मेरे पीसी पर एक संलग्न वाकॉम टैबलेट है।
  6. समस्या अगर मैं टेबलेट पीसी इनपुट सेवा रोक (tabtip.exe)

तो ... मेरे मामले में, वास्तव में, फ्रैंक्स वैकल्पिक हल सही दिशा में है और विचार का समर्थन करता है गायब हो जाता है कि 1. टैबलेट पीसी इनपुट सेवा एक अपराधी है और 2. स्क्रीन में प्रदर्शित (सक्रिय) कोशिकाओं की संख्या अपवाद को फायर करने पर प्रभाव डालती है।

0

मुझे 50K रिकॉर्ड के साथ ग्रिड व्यू में एक ही समस्या थी। स्क्रॉलबार का उपयोग करना या बड़ी संख्या में रिकॉर्ड्स को स्थानांतरित करना डेटाग्रिड व्यू में स्टैक ओवरव्लो एक्सेप्शन का कारण बनता है। इसके बाद के संस्करण को पढ़ने के बाद मैं बस स्क्रीन कीबोर्ड पर आभासी बंद कर दिया सेवा का विवरण (अपनी स्क्रीन टच स्क्रीन है) जैसे ही इसे बंद कर दिया गया था GridView पूरी तरह से काम किया

"टच कीबोर्ड और लिखावट पैनल कलम और स्याही कार्यक्षमता को सक्षम"।

1

सबसे पहले, इस WEIRD समस्या को इंगित करने के लिए @ फ्रैंक वींडल का धन्यवाद (केवल माइक्रोसॉफ्ट इसके साथ आ सकता है)।

उन लोगों के लिए जो आवश्यकता के हिस्से के रूप में "Tabtip.exe" को अक्षम नहीं करना चाहते हैं, कहें कि आपका एप्लिकेशन टैबलेट के लिए है और केवल संभावित इनपुट विधि टैबटिप है, एक कामकाज है।

आप उस घटना पर टैबटिप को मार सकते हैं जहां दुर्घटना होती है। मेरे लिए, यह तब होता है जब मैं 60,000 से अधिक पंक्तियों पर आइटम का चयन करता हूं। यह जो मैंने किया है।

Private Sub DataGridView1_Scroll(sender As Object, e As ScrollEventArgs) Handles DataGridView1.Scroll 
    Call closeKeyboard() 
End Sub 

'When a user have to type something in textbox' 
Private Sub Lookup_Tbox_MouseDown(sender As Object, e As MouseEventArgs) Handles Lookup_Tbox.MouseDown 
    Call OpenKeyboard() 
End Sub 

Public Sub OpenKeyboard() 
    System.Diagnostics.Process.Start("tabtip.exe") 
End Sub 

Public Sub closeKeyboard() 

    Dim proc() As System.Diagnostics.Process = Process.GetProcessesByName("tabtip") 
    For i As Integer = 0 To proc.Length - 1 
     proc(i).Kill() 
    Next i 
End Sub 

आशा है कि यह मेरी समस्या किसी :) मुबारक लड़ :)

0

मैं सटीक समस्या, प्रश्न में वर्णित के रूप में यहाँ पढ़ रहे हैं और अपने खुद के प्रयोग करने के बाद किया था, इस हल में मदद करता है:

private void dataGridView1_Scroll(object sender, ScrollEventArgs ex) 
{ 
    try 
    { 
     dataGridView1.Focus(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 
संबंधित मुद्दे