• 締切済み

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 随分と省いてあり、意味の分からない部分が多数あると思いますが、何か気付いたことや他の部分を書け!という場所があれば教えてください。 一日やっても解決せずに、本当に困り果てています。

みんなの回答

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

No2です。 > Me.field_text = New System.Windows.Forms.TextBox(count, 2) {} > という処理を追加時にすれば、field_textの中身は空になるものなんですかね? そうなるでしょうね。 「新しい(空っぽの)配列を作成して、元の配列と入れ替える」事になりますから・・・

回答No.3

「field_text(i,j).Text = ""」でエラーが発生したときの、i,jの値は0,0ですか。 それとも、上記以外? このエラーはインスタンスが実体化されていないときに発生するようですが。 でも「oCommand.Parameters("@sCode").Value = field_text(更新する行の値, 0).Text」の部分では、 テキストボックスの値を参照できているのですよね?

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

> 「オブジェクト参照がオブジェクトインスタンスに設定されていません」 > Private field_text(,) As System.Windows.Forms.TextBox > f_text(i, j).Text = ""  ←ここでエラー だとすると、 > VB.netでフォームロード時に、Accessに登録されている件数分だけテキストコントロールを動的に配置(配列処理をしています)、 ここの処理で失敗or間違っているのでは? 具体的なコードはどうなってます?

l_natume
質問者

お礼

フォームロード時の、コントロール配置処理は以下の通りです (フォームロード時のコントロール配置、追加ボタンを押した後の一行分を増やすコントロール配置は以下で一緒に処理しています) 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の中身は空になるものなんですかね? 何か間違っている点がありましたら、ご指摘お願いします

回答No.1

単純な質問ですが、 f_textは宣言されているんでしたっけ。field_textとは別物ですよね。 処理の流れだと「field_text(i,j).Text = ""」のような気がしますが。

l_natume
質問者

お礼

す、すみませんっ!! f_text と field_textは同じです。書き間違えました。 言われたとおり、field_text(i,j).Text = "" で宜しくお願いします。

関連するQ&A

  • ”オブジェクト参照がオブジェクト インスタンスに設定されていません。”って

    開発初心者で困っております。 VisualBasic2005、SQL Server2005Expressで開発しています。 DataGridViewのToolStripでフィルターを掛けたいのですが、フィルタの実行をすると、Dgvで行っているカラム1+カラム2の計算をしているSubプロシージャで”オブジェクト参照がオブジェクト インスタンスに設定されていません。”というエラーが出て中断します。 下記にソースを記載します。 (ToolStripフィルタ実行)----------------------------------------- Private Sub FillByDivToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillByDivToolStripButton.Click If cmbDiv.Text <> "" Then Try Me.T_payscheduleTableAdapter.FillByDiv(Me.MoPDataSet.t_payschedule, cmbDiv.Text) ・・・ (Dgvの計算部分)------------------------------------------------- Private Sub T_payscheduleDataGridView_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_payscheduleDataGridView.SelectionChanged Dim iRow As Integer =Me.T_payscheduleDataGridView.CurrentCell.RowIndex() ←ここでエラー発生!! Dim iCol As Integer=Me.T_payscheduleDataGridView.CurrentCell.ColumnIndex() ・・・ ------------------------------------------------------------- エラーMsgを手掛かりに色々調べてはいるのですが解決の糸口がつかめません。よろしくお願いします。

  • Visual Basic.NETのエラー("オブジェクト参照がオブジェクト インスタンスに設定されていません。")について

    DLLを読み込むプログラムで、以下のように宣言した関数"VCread_wave_file"を呼び出そうとすると、 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーが出てしまうのですが、なぜなのでしょうか? プログラムは以下のようになっています。 Public Class Form1 Inherits System.Windows.Forms.Form Dim status As Integer Dim wavelength As Long Dim samplf As Double Private Declare Function VCread_wave_file Lib "Vcon.dll" (ByVal FileName As String, ByVal tmpFilename As String, ByVal wavelength As Long, ByVal samplingFrequency As Double) As Integer (中略) Private Sub ChangeStartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChangeStartButton.Click status = VCread_wave_file("rectmp.wav", "rectmp.raw", wavelength, samplf) Label4.Text = status End Sub よろしくお願いいたします。

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • VB.NET、mdbに新しいデータを追加したい

    超初心者で申し訳ありません。下のプログラムにおいてオペレータ名が一致する場合には 更新(UPDATE)する。一致するデータが無い場合には新規登録を行いたいのですが どのように書いたらいいのかさっぱりでNETを相当探したのですが回答が見つかりません。 お手数ですがどなたか助けていただけませんでしょうか。なお、一致する場合には 更新(UPDATE)は動作するようになりました。 VBを始めて2ケ月になります。Microsoftの文献を見ても難しくてまだ理解できるレベルに達していません。どなたか、よろしくお願い致します。 「データ構造」 ID          integer オペレータ名   string ランク       integer パスワード    string 補足       string Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '■■■■■■■■■■■■■■■■■■■■■■■■ '■■■   オペレータの新規/更新登録   ■■■  '■■■■■■■■■■■■■■■■■■■■■■■■ '----------------------------------------------------------- 'コネクションを作成 Dim CurrentDir As String = System.IO.Directory.GetCurrentDirectory() Dim cn As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & CurrentDir & "\operator.mdb" '**************** コマンドを作成 **************** Dim OPE As String Dim PWORD As String Dim HOSOKU As String Dim RANK As Integer OPE = オペレータ名.Text RANK = ランク.Text HOSOKU = 補足.Text PWORD = パスワード.Text Dim cmd As New OleDbCommand( "UPDATE table1 " & "SET ランク = ? " & "," & "パスワード = ? " & "," & "補足 = ? " & " WHERE オペレータ名 = ? ", cn) '************** パラメータを作成 **************** cmd.Parameters.Add("ランク", OleDbType.Integer).Value = RANK cmd.Parameters.Add("パスワード", OleDbType.Char).Value = PWORD cmd.Parameters.Add("補足", OleDbType.Char).Value = HOSOKU cmd.Parameters.Add("オペレータ名", OleDbType.Char).Value = OPE '実行 cn.Open() cmd.ExecuteNonQuery() '-------------------------- Dim COUNTC As Integer COUNTC = cmd.ExecuteNonQuery()   '************************************ elseの中に簡単に記載すのって難???*** If COUNTC > 0 Then MessageBox.Show("更新 完了")     Else 'INSERTの手順       ’★ ここにmdbの中に 項目値 OPE、RANK、HOSOKU、PWORDを挿入(追加)        する命令を入れたい。   '実行 cmd.ExecuteNonQuery() End If ’********************************** '-------------------------- cn.Close() End Sub

  • オブジェクト名を変数で参照できますか

    VB初心者です。 配列の場合 Dim str(10) as string と宣言し、i番目のデータを取り出したいときには、str(i) と記述すると思います。 そこで質問ですが、例えばCommandが1~10まであるとします。 オブジェクト名はそのまま(Command1, Command2)で、それぞれのCaptionに違ったデータが入っています。 (例えば、Command1のCaptionには'A' Command2のCaptionには'B'といった感じに) ある文字列があり、For文を使い、CommandのCaptionとその文字列が一致したときに文字列を出力するという処理を行いたいとき、どのように Command1~10のCaptionを回せばいいのでしょうか? コードを記述しておきます。 Dim str(10) as String Dim i as Integer Dim j as Integer for i = 0 to 10 for j = 0 to 10 ☆☆ if Command(i).Caption = str(j) then print.str(j) end if next next ☆☆のところです。 可能であれば回答をお待ちしております。 環境は windows XP, VB6.0 です。

  • VBプログラム エラーが出ます

    Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tbA" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * k-1))).ToString(), TextBox).Text)    エラー Next tb.Text = sum.ToString() Next Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Do Until Me.Controls.Count <= 6 For Each tbD As Object In Me.Controls If CType(tbD, Control).Name Like "tb*" Then Me.Controls. Remove(tbD) Next Loop End Sub End Class エラーと書いている箇所 どう直したらよいのでしょうか。 縮小変換しないで呼び出されるアクセス可能なitemがないためオーバーロードの解決に失敗しました と出ます。 あとwindowsの画面の大きさを入力される値が小さければ少し小さいwindowsになるように変えたいのですがどうしたよいのでしょう。

  • VBのGUI 行列の和を求める

    VBのGUIです。 行列の足し算を行うプログラムをつくりたいです。 以下のプログラムはできたところまで作成しています。 □個の□行□列(□はテキストボックス)の所に例えばユーザーが3 3 3と入力したとします。 ボタン1を押すと3×3の3個個分のテキストボックスがでてきて、要素を打ち込めるようになります。 そしてユーザが要素を打ち込みます。次に要素が 1 2 1  2 1 2   2 1 2 2 1 2  1 2 1   1 2 1 1 2 1  2 1 2   1 2 1 というように入力されたとします。 ボタン2を押すと 3×3のテキストボックスが出てきて この3つの行列の和を足した 5 4 5 4 5 4 4 5 4というようにテキストボックスに表示されるようにしたいです。 3この3行3列の和だけでなく何個の何行何列の場合でもできるようにしたいです。 どのようなソースでこのプログラムはできるのでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim number As Integer Dim rows As Integer Dim columns As Integer If Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox1.Text, rows) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox2.Text, columns) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If For k = 1 To number For i = 1 To rows For j = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() & "No" & k.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim number As Integer Dim rows As Integer Dim columns As Integer Dim r As Integer Dim n As Integer Dim m As Integer Dim sum As Double sum = 0 For n = 1 To columns For m = 1 To rows sum = 0 For r = 1 To number Next For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 10 tb.Width = 40 Next Next Next Next End Sub End Class

  • vb2005 インスタンスの生成について

    vb2005で質問です Data.vbというグローバル変数を宣言しているモジュールファイルに以下の記述をします。   public x As SortedList(Of Integer, Integer)() = New SortedList(Of Integer, Integer)(1) {} 次にForm1.frmというファイルに、あるイベントのたび、呼び出される処理の中に 以下の記述をします。  x(0) = New SortedList(Of Integer,Integer)  x(1) = New SortedList(Of Integer,Integer) この場合、何度も x(0) = New SortedList(Of Integer,Integer) が 生成されることになりますが、メモリエラーを引き起こす原因に なりえますか すいませんが、教えていただけないでしょうか

  • vb2005 インスタンスの生成について

    vb2005で質問です Data.vbというグローバル変数を宣言しているモジュールファイルに以下の記述をします。   public x As SortedList(Of Integer, Integer)() = New SortedList(Of Integer, Integer)(1) {} 次にForm1.frmというファイルで、ある処理の中に以下の記述をします。  x(0) = New SortedList(Of Integer,Integer)  x(1) = New SortedList(Of Integer,Integer) ここで質問が2つあります。 1)なぜ2回もNEW句を使用しなければならないのでしょうか? 2)x(0)やx(1)について、宣言とインスタンスの生成を同時にする方法はありますか? ご回答よろしくお願い致します。

  • VB 配列の内容をファイルに書き込む

    VB2008を使用しています。 stg_bitという配列に一文字ずつ「abc・・・」 のように入っているものを、テキストファイルに出力したいのですが・・・ stg_bitという配列の内容をファイルに書き込みたいのですが、 うまくいきません。 ご教授お願いします!! Dim i As Integer Dim stg_str As String Dim Writer As New IO.StreamWriter("C:sample.txt") Writer.WriteLine(stg_bit) Writer.Close()

専門家に質問してみよう