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

  • 質問

  • こんにちわ。                                                  ビジュアルスタジオを学んで一ヶ月にも満たないものです。ビジュアルスタジオ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 If

    DataGridView1.DataSource = dt
    end sub

    宜しくお願い申し上げます。

     

    2012年12月19日 2:03

回答

  • フォーム3は開きっぱなしですか? であれば、以下のようにしてみて下さい。(すみません。コードの実際の実行は未検証ですので、微妙にミスがあるかもしれません)
    データテーブルのインスタンスをコンストラクタ(New())で作成し、以後、それを使い回します。Fillメソッドは追加、もしくは更新ですので、Fillする度にその唯一のデータテーブルに追加されていきます。

    'このフォーム(クラス)全体でどこからでもdtが見えるようにします。
    Dim dt As DataTable

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        'DataTableのインスタンスを作成し、dtにセットします。
        dt = New DataTable

    End 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
    2012年12月19日 7:52
    モデレータ

すべての返信

  • 「条件入力->検索->条件入力->検索」と繰り返したときに、前の結果が消えてしまうということですよね?
    Dim dt As New DataTable
    (略)
    DataGridView1.DataSource = dt
    この部分で、検索するたびに毎回DataTableを作り直しているために、新しいDataTableのみが表示されています。
    DataTableの作成とDataSourceへのセットするのを1回だけになるようにすると消えなくなるはずです。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2012年12月19日 3:50
  • gekka様 こんにちわ 回答ありがとうございます

    >DataTableの作成とDataSourceへのセットするのを1回だけになるようにすると消えなくなるはずです。

    原因はなんとなくわかりましたが、具体的なコードをご教授いただけると助かります。

    どのように手をつけてよいかさっぱりわかりません。無理ばかりで恐縮です

    宜しくお願い申し上げます


    2012年12月19日 4:21
  • 回答は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/

    2012年12月19日 4:31
    モデレータ
  • trapemiya様

    ご回答ありがとうございます。初学者でして全て意味を理解していないのが現状です。頂いた回答で多々学ぶことがあります。ありがとうございます。上司や先輩と相談して今後やって行きたく思います。 ですが解決していないので、あつかましいお願いで恐縮ですが質問に対しての回答を頂ければ幸いです。

    2012年12月19日 7:12
  • フォーム3は開きっぱなしですか? であれば、以下のようにしてみて下さい。(すみません。コードの実際の実行は未検証ですので、微妙にミスがあるかもしれません)
    データテーブルのインスタンスをコンストラクタ(New())で作成し、以後、それを使い回します。Fillメソッドは追加、もしくは更新ですので、Fillする度にその唯一のデータテーブルに追加されていきます。

    'このフォーム(クラス)全体でどこからでもdtが見えるようにします。
    Dim dt As DataTable

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        'DataTableのインスタンスを作成し、dtにセットします。
        dt = New DataTable

    End 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
    2012年12月19日 7:52
    モデレータ