トップ回答者
データテーブルに含まれる内容が単数でも複数でも、全ての内容をデータグリッドビューに表示させたい

質問
-
こんにちわ。 ビジュアルスタジオを学んで一ヶ月にも満たないものです。ビジュアルスタジオ2010Proを使っています。アクセス2003へ接続して宛名印刷のプログラムを作っています。フォームというのはWindowsフォームです。
フォーム4で名前を検索、ヒットした名前のコードをフォーム3のテキストボックス1に表示。
ボタン3をクリックして以下を行っています。
名前コードを主キーにしてフルネームや住所、郵便番号をデータテーブル(以下DT)に引き渡し、フォーム3のテキストボックス4から6に、フルネームや住所、郵便番号を表示させています。DTに引き渡すのと同時にデータグリッドビュー(以下DGV)1にDTの内容を表示させています。DTの内容が1件のみの場合は問題ないのですが、検索したい名前が複数ある場合、DGV1には1件のみしか表示されません。(複数回検索しても直前のデータが上書きされます。)Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim Cn As New OleDbConnection
Dim Command As OleDbCommand = New OleDbCommand
Dim OLEDBCon As OleDb.OleDbConnection = _
New OleDb.OleDbConnection
OLEDBCon.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=D:\temp\test.mdb;" & _
"Persist Security Info=False"
Command.Connection = OLEDBCon
Command.CommandText = "select 郵便番号, 住所, 名前 from 名前T where 名前コード = @名前コード "
Command.Parameters.AddWithValue("@名前コード", TextBox1.Text)
Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter
Dim dt As New DataTable
Adapter.SelectCommand = Command
Adapter.Fill(dt)
If dt.Rows.Count = 1 Then
TextBox4.Text = CStr(dt.Rows(0).Item(1))
TextBox5.Text = CStr(dt.Rows(0).Item(2))
TextBox6.Text = CStr(dt.Rows(0).Item(3))
Else
MessageBox.Show("表示不可")
End IfDataGridView1.DataSource = dt
end sub宜しくお願い申し上げます。
回答
-
フォーム3は開きっぱなしですか? であれば、以下のようにしてみて下さい。(すみません。コードの実際の実行は未検証ですので、微妙にミスがあるかもしれません)
データテーブルのインスタンスをコンストラクタ(New())で作成し、以後、それを使い回します。Fillメソッドは追加、もしくは更新ですので、Fillする度にその唯一のデータテーブルに追加されていきます。'このフォーム(クラス)全体でどこからでもdtが見えるようにします。
Dim dt As DataTablePublic Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()' InitializeComponent() 呼び出しの後で初期化を追加します。
'DataTableのインスタンスを作成し、dtにセットします。
dt = New DataTableEnd Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click~ 略 ~
'以下の行をコメントアウトします。
'Dim dt As New DataTable~ 略 ~
end sub
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク やま33 2012年12月20日 1:46
すべての返信
-
「条件入力->検索->条件入力->検索」と繰り返したときに、前の結果が消えてしまうということですよね?
Dim dt As New DataTable
この部分で、検索するたびに毎回DataTableを作り直しているために、新しいDataTableのみが表示されています。
(略)
DataGridView1.DataSource = dt
DataTableの作成とDataSourceへのセットするのを1回だけになるようにすると消えなくなるはずです。個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
回答はgekkaさんが書かれている通りですが、初学者ということですので、解決されてこのスレッドが読まれなくなる前に気になった点を書いておきます。
OledDbConnectionを利用されていますが、コネクションを使うにはOpenメソッドでその接続を開く必要があります。ではなぜ、上記のコードではOpenメソッドを実行しないのにもかかわらず接続できているのでしょうか? それは、OledDbAdapterが自動的に接続を開き、使い終わったらそれを閉じるという動作を内部でしているからです。正確に言えば、接続を使い終わった際に、接続を使う前に既に接続が開いていれば開いたままにしますし、閉じていれば閉じたままにします。
ですから、上記のコードで一応は問題ありませんが、接続を開いたら必ず閉じるという意識を持つことは非常に重要です。そのための便利な機能としてUsing句がありますので、それを利用する癖を付けられると良いと思います。接続を開きっぱなしにすると資源を使ったままになります。Using句を使った例は以下にありますので、参考にしてみて下さい。
OleDbConnection クラス
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbconnection(v=vs.80).aspx★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
フォーム3は開きっぱなしですか? であれば、以下のようにしてみて下さい。(すみません。コードの実際の実行は未検証ですので、微妙にミスがあるかもしれません)
データテーブルのインスタンスをコンストラクタ(New())で作成し、以後、それを使い回します。Fillメソッドは追加、もしくは更新ですので、Fillする度にその唯一のデータテーブルに追加されていきます。'このフォーム(クラス)全体でどこからでもdtが見えるようにします。
Dim dt As DataTablePublic Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()' InitializeComponent() 呼び出しの後で初期化を追加します。
'DataTableのインスタンスを作成し、dtにセットします。
dt = New DataTableEnd Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click~ 略 ~
'以下の行をコメントアウトします。
'Dim dt As New DataTable~ 略 ~
end sub
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク やま33 2012年12月20日 1:46