- 締切済み
VB.net エラー「オブジェクト参照がオブジェクトインスタンスに設定されていません」
タイトル通り『オブジェクト参照がオブジェクトインスタンスに設定されていません』というエラーが発生し、全く僕の脳では解決しないので、ここに質問させて頂きます。 VB.netでフォームロード時に、Accessに登録されている件数分だけテキストコントロールを動的に配置(配列処理をしています)、そこにAccessからデータを取り込みます。 追加ボタンで一件分のテキストコントロールを一番下の行になるよう配置。そこにユーザがデータを入力し、更新ボタンを押すことで、Access上にINSERTする。 というような処理です。 で、INSERTはされるのですが、その後textboxの中身を配列の最初から確認しようしたり、データを入れようとしたり、空にしようとしたりすると上のエラーが表示されます。 'テキストの配列' Private field_text(,) As System.Windows.Forms.TextBox Sub s_insert() ' ’ 更新ボタン時の処理 ' Const strinsert As String = "INSERT INTO 社員マスター (SNO,SNAME) VALUES (@sCode,@sName)" Dim oConn As New System.Data.OleDb.OleDbConnection Dim oCommand As New OleDbCommand Dim i As Integer Dim j As Integer Dim insert_ok As Integer 'DB接続のための処理(省略) 'SQL文の設定 oCommand.CommandText = strinsert insert_ok = 0 oCommand.Parameters.Add(New OleDbParameter("@sCode", OleDbType.Char, 10)) oCommand.Parameters("@sCode").Value = field_text(更新する行の値, 0).Text oCommand.Parameters.Add(New OleDbParameter("@syainName", OleDbType.Char, 20)) oCommand.Parameters("@sName").Value = field_text(更新する行の値, 1).Text insert_ok = oCommand.ExecuteNonQuery() 'SQL文を実行' If insert_ok > 0 Then MessageBox.Show("新規登録完了", "メッセージ") End If 'DB接続を閉じる処理(省略) For i = 0 To 登録行数 - 1 For j = 0 To 1 f_text(i, j).Text = "" ←ここでエラー Next j Next i End Sub 随分と省いてあり、意味の分からない部分が多数あると思いますが、何か気付いたことや他の部分を書け!という場所があれば教えてください。 一日やっても解決せずに、本当に困り果てています。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- dsuekichi
- ベストアンサー率64% (171/265)
No2です。 > Me.field_text = New System.Windows.Forms.TextBox(count, 2) {} > という処理を追加時にすれば、field_textの中身は空になるものなんですかね? そうなるでしょうね。 「新しい(空っぽの)配列を作成して、元の配列と入れ替える」事になりますから・・・
- kabilunlun
- ベストアンサー率34% (155/446)
「field_text(i,j).Text = ""」でエラーが発生したときの、i,jの値は0,0ですか。 それとも、上記以外? このエラーはインスタンスが実体化されていないときに発生するようですが。 でも「oCommand.Parameters("@sCode").Value = field_text(更新する行の値, 0).Text」の部分では、 テキストボックスの値を参照できているのですよね?
- dsuekichi
- ベストアンサー率64% (171/265)
> 「オブジェクト参照がオブジェクトインスタンスに設定されていません」 > Private field_text(,) As System.Windows.Forms.TextBox > f_text(i, j).Text = "" ←ここでエラー だとすると、 > VB.netでフォームロード時に、Accessに登録されている件数分だけテキストコントロールを動的に配置(配列処理をしています)、 ここの処理で失敗or間違っているのでは? 具体的なコードはどうなってます?
- kabilunlun
- ベストアンサー率34% (155/446)
単純な質問ですが、 f_textは宣言されているんでしたっけ。field_textとは別物ですよね。 処理の流れだと「field_text(i,j).Text = ""」のような気がしますが。
お礼
す、すみませんっ!! f_text と field_textは同じです。書き間違えました。 言われたとおり、field_text(i,j).Text = "" で宜しくお願いします。
お礼
フォームロード時の、コントロール配置処理は以下の通りです (フォームロード時のコントロール配置、追加ボタンを押した後の一行分を増やすコントロール配置は以下で一緒に処理しています) Sub control() Dim i As Integer Dim j As Integer Dim count As Integer 'count には フォームロード時はAccessにある登録行数、追加の場合はテキストボックスの行数' Me.field_text = New System.Windows.Forms.TextBox(count, 2) {} Me.SuspendLayout() If 追加ボタンを押していたら Then i = テキストボックスの行数 - 追加行数 Else i = 0 'フォームロード時はこちらを通る' End If Do Until i > count - 1 j = 0 Do Until j > 1 Me.field_text(i, j) = New System.Windows.Forms.TextBox 'プロパティ設定 Me.field_text(i, j).Name = i.ToString() Me.field_text(i, j).Text = "" '他、size locationなどは省略 Me.Controls.Add(Me.field_text(i, j)) j = j + 1 Loop i = i + 1 Loop Me.ResumeLayout(False) End Sub またいろんな部分が省略してありますが、これでどうでしょう? …自分で見直していてもどこかやっぱりおかしいような気がしていますが。 Me.field_text = New System.Windows.Forms.TextBox(count, 2) {} という処理を追加時にすれば、field_textの中身は空になるものなんですかね? 何か間違っている点がありましたら、ご指摘お願いします