2013-01-03 19 views
6

これは奇妙なものです。私にはDataGridViewがあります。私は自分のカスタムクラスのオブジェクトを含むListDataSourceを設定しています。リストには約50,000のアイテムがあります。 Designerで表示するすべての列を定義し、AutoGenerateColumnsをfalseに設定しました。DataGridViewでのStackOverflowException

DataSourceを自分のリストに設定すると、すぐに正しく入力されます。私は上下にスクロールし、異なる行を選択することができます。すべてが良いです。私がダウンして道のすべてをスクロールし、DataGridViewを含むウィンドウがフォーカスを失う聞かせたときにでも、すべてがフリーズし、短い後のスタックのようなオーバーフローしながら:DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()方法はに自分自身を呼び出しているいくつかの理由

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 
    ... 

を忘却。スタック全体は、私にとってはむしろ奇妙なようです。 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 Developerサポートに連絡しました。私はWinFormsチームのサポートエンジニアに対応しました。この問題は何らかの形で、Accessibility.dllがMicrosoftのタブレットPC入力サービス(tabtip.exe)が実行されていたときにいつでもロードされていることが分かりました。このサービスは、少なくともすべてのWindows 7 Enterpriseインストールに存在しますが、一般にはタブレットPCを持っている場合や、PCにペン入力デバイスをインストールしている場合にのみ実行されます。私は過去に私のPCにWacom Bambooペンタブレットを使用していたので、なぜこのサービスが動作していたのかが分かりました。 DataGridViewのデータを設定するために使用した方法も、設定したプロパティも設定していないことが判明しました。Accessibility.dll

は、より容易に相互作用して、フォームやフォームに含まれているコントロールに関する追加情報を得るために、特定の周辺機器(ペンタブレットと、特に補助装置)を可能にする、Microsoftのライブラリです。私はこれで100%確信していないが、私は、このような周辺機器がインストールされている場合は、このライブラリが実行中のすべてのWindowsプロセスに自動的に読み込まれると信じています。

は私が提供したダンプを調べた後、マイクロソフトのエンジニアがDataGridViewがダウンして行くことに決めたとAccessibility.dllは、それが起こる聞かせ許さ犯人であることがわかったコードパスで戸惑いました。彼はDataGridViewがこれをしてはならず、これが彼らの最後の問題のように思えたと認めました。しかし、彼は自分のPCと新しく作成されたWindows 7 VMの両方でTablet PC入力サービスを有効にした後でも、問題が再現できませんでした。だから彼は私のPC上で問題を引き起こした主な選手を特定することができたが、根本的な原因を見つけることができず、それ以上追求することができなかった。

これは私の特定のペンタブレットデバイス(ワコム)またはそれ以外のものが原因である可能性があります。その知られていない。誰かがこの問題に遭遇した場合は、私に連絡してください。エンジニアは、原因を絞り込むことができたら、私に連絡するように私に依頼しました。今のところ、サービスをオフにしておくだけで問題が解決されます。

+0

ある日から次の日に私は無料のLogExpertアプリケーションを定期的にクラッシュさせ始め、この問題を追跡しました。私は何かが私のマシン(おそらく私の電話を差し込んで私はペンベースのデバイスを接続したことがない)でタブレットPC入力サービスの有効化を引き起こしたと思う。 –

0

私はcompletlyウルpromblemを理解していないのですが、 1:私は、私は解決策持ってウル問題はDataGridViewのとメモリ

の遅 だと思うだけのDataGridViewに最大100行を表示するようにページにDataGridViewの行をブレークし、次のhundreadをが、トンまたは他の制御は、それがウルビデオメモリを減らすのに役立つクリック 2:DataGridViewの 3をダブルBuffredを有効にします。簡単に項目を描画するために、レイアウト機能を使用Suspendlayoutと再開

1

私は、DataGridViewでStackOverflowsExceptionの非常に似たシナリオに遭遇しました。

条件:

  1. DataGridViewコントロールをホストするのWinForm。 DataGridViewプロパティReadOnlyとVirtualModeをtrueに設定します。
  2. VirtualModeのは(http://msdn.microsoft.com/en-us/library/2b177d6d.aspx
  3. ロードデータのかなりの量(15列×1×10^5行)のDataGridViewの
  4. 動作が正常であるMSFTのマニュアルに従って実施OnCellValueNeeded(すなわち、GUIの応答性は、行及びセルの選択、垂直方向&水平スクロール)の場合、10列×30行[300セル]しか表示されません。表示されるセルの数がはるかに多くなるように表示を最大化すると、DataGridViewのStackOverflowsExceptionが発生します。
  5. 私もPCにWacomタブレットが付いています。
  6. 問題は、私は(tabtip.exe)私の場合は

そう... Tablet PC入力サービスを停止した場合、確かに、フランクの回避策は正しい方向にあると考えを支持消え1.次の点Tablet PC入力サービスが原因です。2.画面に表示されている(アクティブな)セルの数が例外の発生に影響します。

0

50KレコードのGridViewと同じ問題がありました。 ScrollBarを使用するか、単純に多数のレコードを移動すると、DataGridViewでStackOverflowsExceptionが発生しました。上記を読んだ後、私は画面キーボード上の仮想画面を停止しました(私の画面はタッチスクリーンです)。サービスの説明 "タッチキーボードと手書きパネルのペンとインクの機能を有効にします"

これが止まるとすぐに、

1

まず、このWEIRDの問題を指摘してくれた@Frank Weindelに感謝します(マイクロソフトだけがこれを思い付くことができます)。

要件の一部として「Tabtip.exe」を無効にしたくない人は、アプリケーションがタブレット用で、入力方法が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); 
    } 
} 
関連する問題