• 締切済み

datagridviewでたまに例外・・

モジュールからフォームの関数を呼び出し時にたまに以下の例外が発生しており、 なぜ例外が発生するのか原因がわからず困っています。 オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 System.Windows.Forms.DataGridViewIntLinkedList.Remove(Int32 integer) 場所 System.Windows.Forms.DataGridView.SetSelectedRowCore(Int32 rowIndex, Boolean selected) 場所 System.Windows.Forms.DataGridView.ClearSelection() 場所 System.Windows.Forms.DataGridView.set_SelectionMode(DataGridViewSelectionMode value) 以下のようなフォームがありgridset()はタイマーで動いているモジュールの関数より呼び出されます。 Public Class frmTest Private Sub frmTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load gFrmTest = Me End Sub Public Function gridset() dataGridView1.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect ☆例外発生箇所    ・    ・ End Function End Class Module Modtest //以下はタイマーで何回も呼ばれる関数 Public Function aaa() As Integer gfrmTest.gridset() End Function End Module 環境はvb.net 2008です。 ご教示いただけますと助かります。 よろしくお願いします。

みんなの回答

noname#212058
noname#212058
回答No.3

回答No.2 です。もう解決したでしょうか? System.Threading.Timerを使用しているとのことですが、このタイマは Microsoft の公式リファレンスに『Windows フォームでの使用は推奨されない』と明記されてますね。 https://msdn.microsoft.com/ja-jp/library/system.threading.timer%28v=vs.110%29.aspx 『ユーザー インターフェイス スレッドではコールバックが発生しないため、Windows フォームで使用することは推奨されません。 Windows フォームで使用する場合は、System.Windows.Forms.Timer を選択することをお勧めします。』

noname#212058
noname#212058
回答No.2

タイマー呼出とのことですが、具体的にどのタイマーを使用していますか?  System.Windows.Forms.Timer  System.Threading.Timer  System.Timers.Timer System.Windows.Forms.Timer 以外を使用していた場合、タイミングによっておかしな動きをする可能性があります。 また、どこかで Application.DoEvents() を実行していたりしないでしょうか? このメソッドを叩いていると、異常なタイミングでタイマーが動いてやっぱりおかしなことが起こる可能性があります。 …タイマーを使った処理は『たまに発生する』系のエラーが起こると、原因特定が面倒なので正直お勧めでないですけどね。『本当にタイマーでしか処理できないのか (何か DataGridView の別のイベントで代替できないか)』というアプローチから考えたほうが早いことも多いですよ。

chiro1982
質問者

お礼

ご回答ありがとうございます。 モジュール関数は以下のような形で呼ばれています。 System.Threading.Timerを使用しておりました。 自PCでは出ないのですが客先ででてしまい、再現をしてみたいのですが・・ 原因わからず・・で困っておりました。 Imports System.Threading Public aTimer100 As Timer Public aTimer100Delegate As TimerCallback Public Sub IntvalTimerStart() aTimer100Delegate = New TimerCallback(AddressOf OnTimed100Event) aTimer100 = New Timer(aTimer100Delegate, Nothing, 0, 100) End Sub Public Sub OnTimed100Event(ByVal o As Object)    aaa() End Sub

回答No.1

例外箇所がわかっているのであればtry...catchで確認されると取っ掛かりが得られるのではないかと思います。これといった解決策でなくてすみませんが。。。

chiro1982
質問者

お礼

ご回答ありがとうございます。 確認してみます。