みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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です。
ご教示いただけますと助かります。
よろしくお願いします。

投稿日時 - 2015-06-18 20:35:12

QNo.8996663

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(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 を選択することをお勧めします。』

投稿日時 - 2015-06-28 04:15:44

タイマー呼出とのことですが、具体的にどのタイマーを使用していますか?
 System.Windows.Forms.Timer
 System.Threading.Timer
 System.Timers.Timer
System.Windows.Forms.Timer 以外を使用していた場合、タイミングによっておかしな動きをする可能性があります。

また、どこかで Application.DoEvents() を実行していたりしないでしょうか? このメソッドを叩いていると、異常なタイミングでタイマーが動いてやっぱりおかしなことが起こる可能性があります。


…タイマーを使った処理は『たまに発生する』系のエラーが起こると、原因特定が面倒なので正直お勧めでないですけどね。『本当にタイマーでしか処理できないのか (何か DataGridView の別のイベントで代替できないか)』というアプローチから考えたほうが早いことも多いですよ。

投稿日時 - 2015-06-19 00:46:34

お礼

ご回答ありがとうございます。
モジュール関数は以下のような形で呼ばれています。
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

投稿日時 - 2015-06-19 09:04:29

ANo.1

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

投稿日時 - 2015-06-18 21:04:01

お礼

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

投稿日時 - 2015-06-19 08:58:46

あなたにオススメの質問