- ベストアンサー
VB2008 コンボボックスとテキストボックスの連動について
VBを使って顧客の検索などに使用するプログラムを作りたいと思っています。 項目1-1,項目1-2,項目1-3,項目1-4,項目1-5 項目2-1,項目2-2,項目2-3,項目2-4,項目2-5 項目3-1,項目3-2,項目3-3,項目3-4,項目3-5 上記のデータ名 TextFile1.txt Dim fn As String = "C:\TextFile1.txt" Dim dline() As String Dim d() As String Dim ad As ArrayList = New ArrayList() Dim read As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(fn, System.Text.Encoding.Default) dline = Split(read.ReadToEnd, vbCrLf) For i As Integer = LBound(dline) To UBound(dline) d = Split(dline(i), ",") ad.Add(d(0)) Next ComboBox1.DataSource = ad ComboBox1.text="顧客名" 以上が現在の状況です。 comboに項目1-1,2-1,3-1とセットされていますが、マウスのスクロールボタンを動かすと、項目1-1が最初に表示されず2-1が表示されます。通常にクリックして選択すると問題は無いのですが、出来ればマウスのスクロールボタンも使いたいと思いますが解決方法はあるのでしょうか。 もう1件お伺いしたいのですが、上記テキストファイルからデータを読込、項目1-2,1-3,1-4,1-5、項目2-2・・・、項目3-2・・・と、項目毎にコンボボックスと連動させて各テキストボックス1、2、3、4に表示させたいのですが、上手くいきません。長文で解りにくい点があるかと思いますが、よろしくお願い致します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
コンボボックスの中身が以下のようになっているのであれば、あとはNo2さんの提示してくれたやり方でできるのではないでしょうか? ComboBox1 [0]:ササキ [1]:スズキ [2]:サトウ [3]:ハヤシ ComboBox2 [0]:北海道 [1]:福岡県 [2]:愛知県 [3]:北海道 ComboBox3 [0]:札幌市 [1]:福岡市 [2]:名古屋市 [3]:旭川市 このようになっていないのであれば・・・ 0.変数を定義(必要になったらそのつど定義でも問題ないです) ・1行読み込みsplitした結果を入れる配列→srcAry ・↑の結果の[0]の内容を入れるList→nameList ・↑の結果の[1]の内容を入れるList→adr1List ・↑の結果の[2]の内容を入れるList→adr2List 1.テキストファイルから1行読み込む 2.読み込んだ内容をカンマでsplitし、srcAryに格納 3.各リストに追加していく。nameList.add(srcAry(0))、adr1List.add(srcAry(1))、adr2List.add(srcAry(2)) 4.1~3をテキストファイルの行数くりかえす。 5.ComboBox1にnameList、ComboBox2にadr1List、ComboBox2にadr2Listを設定する。 各コンボボックスが変更された場合の動作についてはNo2さんのソースを参考にしてください。
その他の回答 (7)
- ProKaseifu
- ベストアンサー率51% (98/192)
CSVデータに不備はありませんでしょうか? 名前,都道府県,市区町村名 のように1行あたりのデータが 登録されていれば問題ありませんが、たとえばCSVデータの 一部に不備があり名前がないデータがあった場合。 例)北海道,旭川市 srcAry(0) = 北海道 arcAry(1) = 旭川市 srcAry(2) = 存在しない 上記のようにデータが作成されるため、srcAry(2)を 参照しようとするとおっしゃるとおりのエラーが発生 します。 1行読み込んでsplitしているところに何件目のデータ を処理しているのか、CSVデータの内容はどうなってい るのか等をダンプしてみてはいかがでしょうか?
お礼
ご回答ありがとうございます。 ご指摘頂いたとおりファイルをチェックしてみたところ ササキ,北海道,札幌市, スズキ,福岡県,福岡市, サトウ,愛知県,名古屋市, ハヤシ,北海道,旭川市, 最後の旭川市の後にEnterで改行されていました。 その改行を消去すると思うとおりに動作するようになりました。 何度も親切にご回答いただきまして、ありがとうございます。 今後も勉強しながら取り組んでいこうと思いますので、どうしても解決出来ない場合はご質問させていただきますので、よろしくお願い致します。
- ProKaseifu
- ベストアンサー率51% (98/192)
namelist.Add(srcary(0)) ←「・↑の結果の[0]の内容を入れるList→nameList」 adr1list.Add(srcary(0)) ←「・↑の結果の[1]の内容を入れるList→adr1List」 adr2list.Add(srcary(0)) ←「・↑の結果の[2]の内容を入れるList→adr2List」 単純なミスですね。 srcary(0)が全部(0)になってます。 srcaryには [0]:名前 [1]:都道府県 [2]:市区町村名 と入っているはずですので添え字を変えてあげる必要があります。 namelist.Add(srcary(0)) adr1list.Add(srcary(1)) adr2list.Add(srcary(2))
補足
ご返事が遅くなってしまいました。ご回答ありがとうございます。 ご指摘いただきましたとおり、 namelist.Add(srcary(0)) adr1list.Add(srcary(1)) adr2list.Add(srcary(2)) として、プログラムを実行すると、 「IndexOutOfRangeExceptionは、ハンドルされませんでした」 「インデックスが境界の範囲外です」 という、エラーが出てしまいます。 なんとか自分で解決方法をと思い調べているのですが、解りませんでした。アドバイスいただけますでしょうか。よろしくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
SelectedIndexプロパティは選択項目がある場合 0から個数-1までの値になります 3個のアイテムがあるなら 0,1,2と-1がとりうる値です -1の場合は 選択項目がない状態になります 1-2,2-2,3-2 がそれぞれ 0,1,2の対応になりますよ ComboBox2.SelectedIndex = ComboBox1.SelectedIndex といった具合にしてください 右辺を ComboBox1.SelectedIndex + 1 してしまうと 0,1,2,3がとりうる値になり 3になってしまうとエラーになると思います
補足
ご回答ありがとうございます。 もしかすると、自分の説明が悪く上手く伝わってないのかと思い、一度整理させていただきます。 現在フォームにcombobox1、combobox2、combobox3、と3つあります。 ササキ,北海道,札幌市,,,,, スズキ,福岡県,福岡市,,,,, サトウ,愛知県,名古屋市,,,,, ハヤシ,北海道,旭川市,,,,, という形で数百件の顧客データ TextFile1.txt があります。 combobox1で"ササキ"を選択すると、combobox2は"北海道"、combobox3は"札幌市"という形で表示させたいと思ってます。(comboboxは電話番号等もある為、今後増やしていく予定です) 最終的には、combobox2で"北海道"を選択すると、顧客名のところは北海道の方のみを表示させるという所までやりたいと思っています。 自分なりに色々調べていくうちに、テキストファイルの行を読込み、Splitでカンマ区切りで配列をして、それを各comboboxにセットする?という事は素人なりに解ったのですが(これも自信がありませんが)、各comboboxにどうセットしていくのか。という所から行き詰っています。 アドバイスいただきましたとおり ComboBox2.SelectedIndex = ComboBox1.SelectedIndex としてみましたが、前回同様のエラーが出てしまいました。 別にご回答いただいたproKaseifuさんからは「質問者のソースを見る限りComboBox1以外にデータを設定していないような」というアドバイスもいただきました。combobox2,combobox3にデータを設定するとしたらどういうソースを書いていくといいのでしょうか。何度も大変申し訳ございませんが、よろしくお願い致します。
- ProKaseifu
- ベストアンサー率51% (98/192)
問題を整理させてください。 やりたいこと:ComboBox1の値が変更されるとTextBox1にComboBox1の中身を表示する。 ComboBox1の中身 [0]:項目1-1 [1]:項目1-2 [2]:項目1-3 [3]:項目1-4 ではないのでしょうか?(連動~のところはとりあえずおいときます、No2さんのソースで間違ってないと思いますが、質問者のソースを見る限りComboBox1以外にデータを設定していないような・・・) 上記内容であれば TextBox1.Text = ComboBox1.SelectedItem.ToString で実現可能と思われます。 >次に >ComboBox2.SelectedIndex = ComboBox1.SelectedItem.ToString >とすると、下記エラーが出ます。 >String "ササキ" から型 'Integer' への変換は無効です。 数値項目に文字列を入れようとしてエラーとなっています。
補足
ご回答ありがとうございます。 説明が悪く申し訳ありません。一度整理させていただきます。 現在フォームにcombobox1、combobox2、combobox3、と3つあります。 ササキ,北海道,札幌市,,,,, スズキ,福岡県,福岡市,,,,, サトウ,愛知県,名古屋市,,,,, ハヤシ,北海道,旭川市,,,,, という形で数百件の顧客データ TextFile1.txt があります。 combobox1で"ササキ"を選択すると、combobox2は"北海道"、combobox3は"札幌市"という形で表示させたいと思ってます。(comboboxは電話番号等もある為、今後増やしていく予定です) 最終的には、combobox2で"北海道"を選択すると、顧客名のところは北海道の方のみを表示させるという所までやりたいと思っています。 自分なりに色々調べていくうちに、テキストファイルの行を読込み、Splitでカンマ区切りで配列をして、それを各comboboxにセットする?という事は素人なりに解ったのですが(これも自信がありませんが)、各comboboxにどうセットしていくのか。という所から行き詰っています。
- ProKaseifu
- ベストアンサー率51% (98/192)
APIとかは調べてみたのでしょうか? ComboBox1.SelectedItem.ToString で何が表示されるかみてみましょう。 (ArrayListの中身がクラスオブジェクトとかの場合はこれじゃだめですが)
補足
素人なもので、まず「APIとは?」という所からスタートなんです。 こちらは、頑張って使い方を調べてみようと思います。 ComboBox1.SelectedItem.ToStringはこの使い方でいいのでしょうか。 ComboBox2.text = ComboBox1.SelectedItem.ToString とすると、ComboBox1と同じ名前が表示されます。 次に ComboBox2.SelectedIndex = ComboBox1.SelectedItem.ToString とすると、下記エラーが出ます。 String "ササキ" から型 'Integer' への変換は無効です。 根本的に間違った事をしてましたら、申し訳ございません。よろしくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
ComboBox1とComboBox2やComboBox3を連動させたいなら Private Sub Combobox1_SelectedIndexChanged(省略~) If Combobox1.SelectedIndex > -1 Then Combobox2.SelectedIndex = Combobox1.SelectedIndex Else Combobox2.Text = "未選択" End If End Sub Private Sub Combobox2_SelectedIndexChanged(省略~) If Combobox2.SelectedIndex > -1 Then Combobox3.SelectedIndex = Combobox2.SelectedIndex Else Combobox3.Text = "未選択" End If End Sub といった具合にして見ましょう TextプロパティではなくSelectedIndexプロパティを操作してやれば選択肢が変更できますよ
補足
ご回答ありがとうございます。まずはcombobox2を連動させようと思いますが、Combobox2.textをCombobox2.SelectedIndexにしてみた所、下記のエラーが出てしまいました。 '1' の InvalidArgument=Value は 'SelectedIndex' に対して有効ではありません。 パラメータ名: SelectedIndex 下記が現在の内容です。よろしくお願い致します。 Imports System.IO ----------------- Public Class Form1 Private Sub Form1_Load(省略~) Dim fn As String = ""C:\TextFile1.txt" Dim dline() As String Dim d() As String Dim ad As ArrayList = New ArrayList() Dim read As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(fn, System.Text.Encoding.Default) dline = Split(read.ReadToEnd, vbCrLf) For i As Integer = LBound(dline) To UBound(dline) d = Split(dline(i), ",") ad.Add(d(0)) Next ComboBox1.DataSource = ad ComboBox1.SelectedIndex = -1 ComboBox1.Text = "顧客名" ComboBox2.Text = "都道府県" ComboBox3.Text = "市町村" End Sub ------------------------------------------ Private Sub ComboBox1_SelectedIndexChanged(省略~) If ComboBox1.SelectedIndex > -1 Then ComboBox2.SelectedIndex = ComboBox1.SelectedIndex + 1 Else ComboBox2.Text = "未選択" End If End Sub End Class
- redfox63
- ベストアンサー率71% (1325/1856)
コンボボックスの初期化時に SelectedIndexを -1にしてやれば マウスのスクロールでも『項目1-1』が取得できますよ もう一方の質問は各コンボボックスの SelectedIndexChangedイベントを処理してやればいいように思います if ComboBox1.SelectedIndex > -1 then TextBox1.Text = ComboBox1.SelectedIndex + 1 else TextBox1.Text = "" end if といった具合です
お礼
ご回答ありがとうございます。マウススクロールの件は解決する事ができました。どうもありがとうございます。 もう1件の質問ですが、項目1-2,項目1-3を表示せずに数字が1,2,3と表示されてしまいます。補足の書き方では解りづらいと思いこちらに書かせていただきました。よろしくお願い致します。
補足
ご回答ありがとうございます。マウススクロールの件は解決する事ができました。 もう1件の方ですが、 Private Sub Combobox1_SelectedIndexChanged(省略~) If Combobox1.SelectedIndex > -1 Then Combobox2.Text = Combobox1.SelectedIndex + 1 Else Combobox2.Text = "" End If End Sub 上記で、コンボボックス1に連動してコンボボックス2の動作を確認できました。コンボボックス2にTextFile1.txtの項目1-2を表示させる場合は、Combobox2.Text = Combobox1.SelectedIndex + 1の = の後を変更するのだと思いますが、項目1-2を表示させるにはどのように書けばいいのでしょうか。自分で何日も調べているのですが、項目1-2や項目1-3等の場所を指定して表示させる事が出来ません。アドバイスをいただけないでしょうか。宜しくお願い致します。
補足
ご回答ありがとうございます。 現在の状況を書かせていただきます。 ComboBox1 ↓この形でセットされてます。 [0]:ササキ [1]:スズキ [2]:サトウ [3]:ハヤシ ComboBox2 [0]:北海道 [1]:福岡県 [2]:愛知県 [3]:北海道 ComboBox3 [0]:札幌市 [1]:福岡市 [2]:名古屋市 [3]:旭川市 combobox2とcombobox3が自分ではどうしても上記の形にセット出来ません。セットしようとするとcombobox1と同じ名前がセットされてしまいます。現在の状況を下記のとおり書いてみましたが、何度も申し訳ありませんがアドバイスをよろしくお願い致します。 Dim dline() As String Dim namelist As ArrayList = New ArrayList() Dim adr1list As ArrayList = New ArrayList() Dim adr2list As ArrayList = New ArrayList() dline = Split(Read.ReadToEnd, vbCrLf) ←「1.テキストファイルから1行読み込む」 Dim srcary() As String For i As Integer = LBound(dline) To UBound(dline) ←「4.1~3をテキストファイルの行数くりかえす。」 srcary = Split(dline(i), ",") ←「・1行読み込みsplitした結果を入れる配列→srcAry」 namelist.Add(srcary(0)) ←「・↑の結果の[0]の内容を入れるList→nameList」 adr1list.Add(srcary(0)) ←「・↑の結果の[1]の内容を入れるList→adr1List」 adr2list.Add(srcary(0)) ←「・↑の結果の[2]の内容を入れるList→adr2List」 Next ComboBox1.DataSource = namelist ←「5.ComboBox1にnameList、ComboBox2にadr1List、ComboBox2にadr2Listを設定する。」 ComboBox2.DataSource = adr1list ComboBox3.DataSource = adr2list