- - PR -
取消:VB.NET で NullReferenceException(DataGridに値設定時)
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-05-30 10:58
投稿場所を間違えました。
この内容は再度投稿しなおしさせて頂きます。 削除方法がわからず(30分以内という事でしたが)こんな記述になりました。 紛らわしい事をして申し訳ありません! --------------------------------------------- <環境> 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 [ メッセージ編集済み 編集者: う〜にん 編集日時 2006-05-30 11:23 ] |
1