- PR -

VB.NETでNullReferenceException(DataGridに値設定時):再投稿

1
投稿者投稿内容
う〜にん
会議室デビュー日: 2005/01/02
投稿数: 19
投稿日時: 2006-05-30 11:26
<環境>
Windows XP
VS.NET 2003
.NET Framework 1.1

<質問内容>
件名にありますエラーを解決できずにおります。
どなたかご教授頂けませんでしょうか?

デバッグモードで実行した時にこのエラーが出ました。
このエラーは不定期に発生します。
常に2つ目のDataGirdに値を設定する処理の時に発生します。
ですがcatchブロックではそのエラーを捕まえる事が出来ませんでした。
http://uzgalaxy.com/dotnet/Info-00049/index.html
動きとしてはこちらの 写真1のようになります。
エラーが出ない時は期待する結果が画面に表示されます。

<画面構成/動作内容>
Windowsフォーム画面にDataGrid2つとCommandButtonを配置。
画面表示時とCommandButtonのClick時に2つのDataGridの変更対象列(1列全行)に値を設定。
値を設定する列の各セルには半角英数4文字の値を設定。

Form_Load時
DataGridの固定値の列に値を設定
: (その他処理)
設定出来る条件が揃った時DataGridの可変値の列(今回問題としている列)に値を設定

CommandButton Click時
: (その他処理)
設定出来る条件が揃った時DataGridの可変値の列(今回問題としている列)に値を設定

<エラー内容>
Microsoft Development Environment
'System.NullReferenceException'のハンドルされていない例外が
system.windows.forms.dllで発生しました。
追加情報:オブジェクト参照がオブジェクトインスタンスに設定されていません。

<やった事>
エラーがでる関数内でオブジェクトが
なんらかの理由で無い時が起こり得るのかと思い、
オブジェクトがNothingの時にForm_Load時に行う固定値の設定をさせる処理を
入れたのですが、そこは通らないようでした。
Sleepで少し待ってみたのですが、それも改善はされませんでした。

<Source>
●グローバル変数
'オブジェクト生成
Private ds1 As New DataSet("DataSet1") 'データセット
Private dt1 As DataTable = ds1.Tables.Add("Table1") 'テーブル
Private dgTs1 As New DataGridTableStyle 'テーブルスタイル
Private ds2 As New DataSet("DataSet2") 'データセット
Private dt2 As DataTable = ds2.Tables.Add("Table2") 'テーブル
Private dgTs2 As New DataGridTableStyle 'テーブルスタイル

●Form_LoadでDataGridを作成しているところ
Private Sub CreateSource(ByRef strErr() As String, ByVal Dg As DataGrid,
ByVal strInfo(,) As String,ByVal ds As DataSet,
ByVal dt As DataTable,ByVal dgTs As DataGridTableStyle)

Try

Dim intCnt As Integer '配列要素数
Dim intLoopCnt As Integer 'Loopカウンタ
Dim strVal As String 'Value


'DataGridコントロールを読み取り専用にする
Dg.ReadOnly = True

'テーブル列
Dim dataClumn1 As DataColumn = dt.Columns.Add("列1", GetType(String))
Dim dataClumn2 As DataColumn = dt.Columns.Add("列2", GetType(String))
Dim dataClumn3 As DataColumn = dt.Columns.Add("列3", GetType(String))
'テーブル列スタイル
Dim dgColumnStyle1 As New DataGridTextBoxColumn
Dim dgColumnStyle2 As New DataGridTextBoxColumn
Dim dgColumnStyle3 As New DataGridTextBoxColumn

'テーブルのスタイルを作成
dgTs.MappingName = dt.TableName
Dg.TableStyles.Add(dgTs)
'テーブルの列のスタイルを作成
dgColumnStyle1.MappingName = dataClumn1.ColumnName
dgColumnStyle2.MappingName = dataClumn2.ColumnName
dgColumnStyle3.MappingName = dataClumn3.ColumnName
'ヘッダーにタイトルを設定
dgColumnStyle1.HeaderText = dataClumn1.ColumnName
dgColumnStyle2.HeaderText = dataClumn2.ColumnName
dgColumnStyle3.HeaderText = dataClumn3.ColumnName

'列のスタイルをテーブル・スタイルに登録
dgTs.GridColumnStyles.Add(dgColumnStyle1)
dgTs.GridColumnStyles.Add(dgColumnStyle2)
dgTs.GridColumnStyles.Add(dgColumnStyle3)

'列の幅を設定
dgTs.GridColumnStyles(0).Width = 80
dgTs.GridColumnStyles(1).Width = 140
dgTs.GridColumnStyles(2).Width = 40

'配列要素数取得
intCnt = CInt(strInfo.Length / 2 - 1)

For intLoopCnt = 0 To intCnt

If intLoopCnt < 9 Then
strVal = "0" & (intLoopCnt + 1).ToString
Else
strVal = (intLoopCnt + 1).ToString
End If

dt.Rows.Add(New [Object]() {strInfo(0, intLoopCnt), strInfo(1, intLoopCnt), ""})
Next

'テーブルに対して行われたすべての変更をコミット
dt.AcceptChanges()

'DataGridコントロールにテーブルを表示する
Dg.SetDataBinding(ds, dt.TableName)

Catch ex As Exception
Throw
Finally
End Try
End Sub

●エラーが出ると思われるところ
Private Sub setGuiValDg(ByRef strErr() As String, ByVal strValAll As String, ByVal ctlDg As DataGrid, _
ByRef intStrNo As Integer, ByVal intColFlg As Integer)
Try

Dim intRowCnt As Integer 'DataGrid行数
Dim strVal As String '設定TEXT
Dim strValWork As String 'strVal編集用
Dim intLoopCnt_1 As Integer 'Loopカウンタ(データ編集)
Dim intLoopCnt_2 As Integer 'Loopカウンタ(DgByte数取得)
Dim intEndNo As Integer '読み込み終了位置
Dim intCol As Integer 'DataGrid設定カラムIndex
Dim blnGetRet As Boolean = True '処理結果


'DataGrid名
If ctlDg.Name = "dg1" Then
''固定値の列を再設定
'If dt1 Is Nothing Then
' CreateSource(strErr, Me.dg1, str1, ds1, dt1, dgTs1)
'End If
intRowCnt = dt1.Rows.Count
Else
''固定値の列を再設定
'If dt2 Is Nothing Then
' CreateSource(strErr, Me.dg2, str2, ds2, dt2, dgTs2)
'End If
intRowCnt = dt2.Rows.Count
'NullReferenceExceptionが出るがcatchでは取得出来なかった
'DataTableが無くなっている訳でもなく、暫定でSleep処理としている
'が関係ないみたい
System.Threading.Thread.Sleep(500)
End If

'カラム位置指定
intCol = 2

For intLoopCnt_2 = 0 To intRowCnt - 1

'1文字2桁なので文字数をASCIIに合わせる
intEndNo = Integer.Parse(ctlDg(intLoopCnt_2, 1).ToString()) * 2 - 1 + intStrNo

'strVal編集
'対象文字列をテキストに変換しない
For intLoopCnt_1 = intStrNo To intEndNo Step 2
'1文字ずつ処理
strValWork = Mid(strValAll, intLoopCnt_1 + 1, 2)

'文字を退避
strVal = strVal & strValWork
Next

'DataGridに値を設定
ctlDg(intLoopCnt_2, intCol) = strVal
strVal = ""

'次の処理用に読み込み開始位置を設定
intStrNo = intLoopCnt_1
Next

Catch ex As Exception
getErrMsg(strErr, ex.Message & vbCrLf & MSG_ERR_DG_002)
Throw
Catch ex1 As NullReferenceException
getErrMsg(strErr, ex1.Message & vbCrLf & MSG_ERR_DG_002)
Throw
Finally
End Try
End Sub
1

スキルアップ/キャリアアップ(JOB@IT)