プロが教える店舗&オフィスのセキュリティ対策術

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に表示させたいのですが、上手くいきません。長文で解りにくい点があるかと思いますが、よろしくお願い致します。

A 回答 (8件)

コンボボックスの初期化時に SelectedIndexを -1にしてやれば マウスのスクロールでも『項目1-1』が取得できますよ



もう一方の質問は各コンボボックスの SelectedIndexChangedイベントを処理してやればいいように思います

if ComboBox1.SelectedIndex > -1 then
  TextBox1.Text = ComboBox1.SelectedIndex + 1
else
  TextBox1.Text = ""
end if
といった具合です

この回答への補足

ご回答ありがとうございます。マウススクロールの件は解決する事ができました。
もう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等の場所を指定して表示させる事が出来ません。アドバイスをいただけないでしょうか。宜しくお願い致します。

補足日時:2008/08/10 12:18
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。マウススクロールの件は解決する事ができました。どうもありがとうございます。

もう1件の質問ですが、項目1-2,項目1-3を表示せずに数字が1,2,3と表示されてしまいます。補足の書き方では解りづらいと思いこちらに書かせていただきました。よろしくお願い致します。

お礼日時:2008/08/11 13:29

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

補足日時:2008/08/11 15:38
    • good
    • 0

APIとかは調べてみたのでしょうか?



ComboBox1.SelectedItem.ToString
で何が表示されるかみてみましょう。
(ArrayListの中身がクラスオブジェクトとかの場合はこれじゃだめですが)

この回答への補足

素人なもので、まず「APIとは?」という所からスタートなんです。
こちらは、頑張って使い方を調べてみようと思います。
ComboBox1.SelectedItem.ToStringはこの使い方でいいのでしょうか。

ComboBox2.text = ComboBox1.SelectedItem.ToString
とすると、ComboBox1と同じ名前が表示されます。

次に
ComboBox2.SelectedIndex = ComboBox1.SelectedItem.ToString
とすると、下記エラーが出ます。
String "ササキ" から型 'Integer' への変換は無効です。

根本的に間違った事をしてましたら、申し訳ございません。よろしくお願い致します。

補足日時:2008/08/11 15:50
    • good
    • 0

問題を整理させてください。



やりたいこと: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にどうセットしていくのか。という所から行き詰っています。

補足日時:2008/08/11 18:00
    • good
    • 0

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にデータを設定するとしたらどういうソースを書いていくといいのでしょうか。何度も大変申し訳ございませんが、よろしくお願い致します。

補足日時:2008/08/12 09:30
    • good
    • 0

コンボボックスの中身が以下のようになっているのであれば、あとは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さんのソースを参考にしてください。

この回答への補足

ご回答ありがとうございます。
現在の状況を書かせていただきます。

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

補足日時:2008/08/12 17:34
    • good
    • 0

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は、ハンドルされませんでした」
「インデックスが境界の範囲外です」
という、エラーが出てしまいます。
なんとか自分で解決方法をと思い調べているのですが、解りませんでした。アドバイスいただけますでしょうか。よろしくお願い致します。

補足日時:2008/08/19 10:46
    • good
    • 0

CSVデータに不備はありませんでしょうか?



名前,都道府県,市区町村名 のように1行あたりのデータが
登録されていれば問題ありませんが、たとえばCSVデータの
一部に不備があり名前がないデータがあった場合。

例)北海道,旭川市

srcAry(0) = 北海道
arcAry(1) = 旭川市
srcAry(2) = 存在しない

上記のようにデータが作成されるため、srcAry(2)を
参照しようとするとおっしゃるとおりのエラーが発生
します。

1行読み込んでsplitしているところに何件目のデータ
を処理しているのか、CSVデータの内容はどうなってい
るのか等をダンプしてみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご指摘頂いたとおりファイルをチェックしてみたところ
ササキ,北海道,札幌市,
スズキ,福岡県,福岡市,
サトウ,愛知県,名古屋市,
ハヤシ,北海道,旭川市,
最後の旭川市の後にEnterで改行されていました。
その改行を消去すると思うとおりに動作するようになりました。

何度も親切にご回答いただきまして、ありがとうございます。
今後も勉強しながら取り組んでいこうと思いますので、どうしても解決出来ない場合はご質問させていただきますので、よろしくお願い致します。

お礼日時:2008/08/19 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!