2013-01-03 59 views
6

這是一個奇怪的。我有一個DataGridView。我將DataSource設置爲List,其中包含我自己的自定義類的對象。列表中約有50,000件物品。我定義了所有希望在Designer中可見的列,並將AutoGenerateColumns設置爲false。StackOverflowException與DataGridView

只要我將DataSource設置到我的列表中,它就會立即填充正確。我可以上下滾動,選擇不同的行。一切都很好。但是,當我滾動所有的方式下來,然後讓含有DataGridView失去焦點都凍結起來,而堆棧溢出這樣經過短暫的窗口:

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

修復

沒有鎖定在這個時候知道。

解決方法

禁用從控制面板中的服務面板Tablet PC輸入服務(又名tabtip.exe)。

詳細信息

幾個星期前,我聯繫了Microsoft開發人員對此問題的支持。我與WinForms團隊的一名支持工程師通信,我們發現這個問題在某種程度上是由於Accessibility.dll被加載到我的應用程序中,只要微軟的平板電腦輸入服務(tabtip.exe)正在運行。此服務至少在所有Windows 7 Enterprise安裝中都存在,但通常只在您擁有平板電腦或曾在PC上安裝任何類型的筆輸入設備時才能運行。我以前在PC上使用過Wacom Bamboo筆平板電腦,所以這項服務運行起來很有意義。 請注意,確定我用來填充DataGridView的方法以及我設置的任何屬性都與該問題沒有任何關係。

Accessibility.dll是微軟庫,允許某些外圍設備(手寫板,尤其是輔助設備)更容易互動,並獲得約的形式和包含的形式控制的額外信息。我不是100%確定的,但我相信如果安裝了這樣的外設,這個庫會自動加載到每個正在運行的Windows進程中。

檢查,我已經提供了轉儲後,微軟的工程師對代碼路徑的DataGridView決定走下來,發現Accessibility.dll是允許讓它發生的罪魁禍首不解。他承認,DataGridView不應該這樣做,這似乎是他們最終的問題。但是,即使在他的個人電腦和新制Windows 7虛擬機上打開Tablet PC輸入服務後,他也無法重現問題。所以當他能夠找出造成我PC上問題的主要角色時,他無法找到根本原因,因此無法進一步追求。

這可能歸因於我的特定筆式平板電腦設備(Wacom)或其他所有設備。它的未知。如果有其他人遇到此問題,請與我聯繫。如果我能縮小事業範圍,工程師邀請我聯繫他。目前,只保留服務可以防止問題發生。

+0

從一天到下一天,我開始定期崩潰免費的LogExpert應用程序,並將其追溯到此問題。我猜是什麼觸發了在我的機器上啓用Tablet PC輸入服務(可能插入我的手機?我從未連接過基於筆的設備)。 –

0

我不是完全地理解烏爾問題的探析,但我覺得你的問題是datagridview的記憶緩慢

我有一個解決辦法: 1:中斷的DataGridView一行到像只頁面顯示在DataGridView中最大的100行和下一hundread但在噸或其他控制單擊它有助於減少烏爾顯存 2:上的DataGridView 3啓用雙Buffred:使用Suspendlayout和恢復佈局功能輕易地吸引項目

1

我遇到了DataGridView中的StackOverflowsException非常類似的情況。

條件:

  1. 一個WinForm託管DataGridView控件。 DataGridView屬性ReadOnly和VirtualMode設置爲true。
  2. VirtualMode的OnCellValueNeeded實現爲每MSFT文檔(http://msdn.microsoft.com/en-us/library/2b177d6d.aspx
  3. 負載數據的相當大的量(15列×1×10^5行)
  4. 行爲datagridview的是正常的(即:GUI的響應,行和如果只顯示10列X 30行[300個單元格],則垂直滾動顯示垂直&)。當我最大化顯示,使得顯示的單元格數量大得多時,DataGridView中的StackOverflowsException被觸發。
  5. 我也有一個附加的Wacom數位板到我的電腦。
  6. 問題消失,如果我停止Tablet PC輸入服務(tabtip.exe)

所以......在我的情況,事實上,弗蘭克斯的解決方法是在正確的方向和支持的想法,1。平板電腦輸入服務是一個罪魁禍首,2.屏幕中顯示(活動)單元的數量對解除異常有影響。

0

我有同樣的問題的GridView與50K記錄。使用ScrollBar或者只是移動大量的記錄導致DataGridView中的StackOverflowsException。閱讀完上述內容之後,我簡單地停止了虛擬屏幕鍵盤(我的屏幕是觸摸屏)。服務說明「啓用觸摸鍵盤和手寫面板的筆和墨水功能」

只要停止,GridView就完美地工作。

1

首先,感謝@Frank Weindel用於指向這個奇怪的問題(只有微軟能拿出這一點)。

對於那些不想禁用「Tabtip.exe」作爲要求的一部分,說你的應用程序是用於平板電腦,只有可能的輸入法是Tabtip,有一種解決方法。

您可以在發生崩潰的事件中殺死Tabtip。對我而言,當我選擇行數超過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); 
    } 
}