none
テキストボックスに値を表示させたい RRS feed

  • 質問

  • VS2010を使っております。PCはXPです。

    フォーム5で取引先名を検索、ヒットした取引先名の取引先コードをフォーム3のテキストボックス(以下テキストボックス)1に表示させます。テキストボックス2に印刷枚数、ラジオボタン1から3(敬称)のいずれかを選択します。ボタン9をクリックして以下を行っています。取引先コードをキーにして取引先名、住所、郵便番号をデータテーブル(以下DT)に引き渡します。フォーム3のテキストボックス3から8に、郵便番号、住所1、住所2、取引先名、印刷枚数、敬称を表示させ、テキストボックス11に取引先名敬称印刷枚数を表示させています。 はスペースです。そしてデータグリッドビュー(以下DGV)1DTの内容を表示させています。

    1回の検索では問題ないのですが、複数回検索すると、DGVにはDTの内容は表示されますが、テキストボックス3から6の表示がされず、テキストボックス11にも取引先名が表示されません。

    複数回検索しても、テキストボックス3から6の表示、テキストボックス11にも取引先名が表示されるようにするにはどうすれば良いでしょうか?

    Public Class Form3

     Dim dt As DataTable

     Public Sub New()

     InitializeComponent()

     dt = New DataTable

    End Sub

           Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.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 郵便番号, 住所1, 住所2, 取引先名  from 取引先名T where 得意先コード = @取引先コード "

            Command.Parameters.AddWithValue("@取引先コード", TextBox1.Text)

            Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter

            Adapter.SelectCommand = Command

            Adapter.Fill(dt)

            'レコード取得

            If dt.Rows.Count = 1 Then

                TextBox3.Text = CStr(dt.Rows(0).Item(0))

                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

            '印刷枚数

            Dim d As String = TextBox2.Text

            TextBox7.Text = d

            '敬称

            If RadioButton1.Checked = True Then

                TextBox8.Text = RadioButton1.Text

            ElseIf RadioButton2.Checked = True Then

                TextBox8.Text = RadioButton2.Text

            ElseIf RadioButton3.Checked = True Then

                TextBox8.Text = RadioButton3.Text

            ElseIf RadioButton4.Checked = True Then

                TextBox8.Text = RadioButton4.Text

            End If

            '取引先名

            Dim a As String

            a = TextBox6.Text

            '敬称

            Select Case True

                Case RadioButton1.Checked = True

                    a &= " " & RadioButton1.Text

                Case RadioButton2.Checked = True

                    a &= " " & RadioButton2.Text

                Case RadioButton3.Checked = True

                    a &= " " & RadioButton3.Text

            End Select

            'テキストボックス11に表示

            a &= " " & TextBox2.Text & "" & vbCrLf

            TextBox11.AppendText(a)

            'DTの内容をDGVで確認

            DataGridView1.DataSource = dt

        End Sub 

    End Class

    長いコードを見て頂きありがとうございます。

    宜しくお願い致します。

    2012年12月20日 4:43

回答

  • dt、すなわちデータテーブルは最初の検索では1行ですが、2回目からの検索では複数行になります。よって、

     If dt.Rows.Count = 1 Then

    という条件に当てはまらなくなり、TextBox3からTextBox6にセットされなくなるのでしょう。

    また、If dt.Rows.Count = 1 Thenを削除したとしても、以下のコードのままではうまくいかないでしょう。なぜなら、1行目をセットしているからです。

    TextBox3.Text = CStr(dt.Rows(0).Item(0))

    TextBox4.Text = CStr(dt.Rows(0).Item(1))

    TextBox5.Text = CStr(dt.Rows(0).Item(2))

    TextBox6.Text = CStr(dt.Rows(0).Item(3))

    セットするのであれば、おそらく最後の行の値を使わなければなりません。例えば、以下のようになると思います。

    TextBox3.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(0))

    ところで、なぜ、If dt.Rows.Count = 1 Thenという条件を入れているのでしょうか? 意味を正しく理解してコードを書かれていますか? 自分が書いたコードが何を行っているのかを完全に理解しなければ、このような不具合には対応できません。

    まず、そこから初めてみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年12月25日 5:14
    • 回答としてマーク 佐伯玲 2012年12月27日 6:02
    2012年12月20日 5:13
    モデレータ

すべての返信

  • dt、すなわちデータテーブルは最初の検索では1行ですが、2回目からの検索では複数行になります。よって、

     If dt.Rows.Count = 1 Then

    という条件に当てはまらなくなり、TextBox3からTextBox6にセットされなくなるのでしょう。

    また、If dt.Rows.Count = 1 Thenを削除したとしても、以下のコードのままではうまくいかないでしょう。なぜなら、1行目をセットしているからです。

    TextBox3.Text = CStr(dt.Rows(0).Item(0))

    TextBox4.Text = CStr(dt.Rows(0).Item(1))

    TextBox5.Text = CStr(dt.Rows(0).Item(2))

    TextBox6.Text = CStr(dt.Rows(0).Item(3))

    セットするのであれば、おそらく最後の行の値を使わなければなりません。例えば、以下のようになると思います。

    TextBox3.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(0))

    ところで、なぜ、If dt.Rows.Count = 1 Thenという条件を入れているのでしょうか? 意味を正しく理解してコードを書かれていますか? 自分が書いたコードが何を行っているのかを完全に理解しなければ、このような不具合には対応できません。

    まず、そこから初めてみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年12月25日 5:14
    • 回答としてマーク 佐伯玲 2012年12月27日 6:02
    2012年12月20日 5:13
    モデレータ
  • こんにちは、YTB1 さん
    フォーラムオペレータの佐伯 玲 です。

    その後trapemiya さんの情報はご確認いただけたでしょうか?
    参考になる情報だと思われたので勝手ながら私のほうで「回答としてマーク」とさせて頂きました。

    解決出来なかった場合などにはあとから回答マークを解除することも可能となっております。
    ご確認された結果などもあわせてご返信いただけましたらと思います。

    宜しくお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年12月27日 6:02