- ベストアンサー
[VB2008]リストボックスで項目の重複を避ける
タイトル通り、リストボックスに項目を追加した時に 同じ項目が2つにならないようにするにはどうすればよいでしょうか? 例えば 「あ い う」とリストボックスに入っていたとして ここに「あ」を追加した時に 「い う あ」という風になるようにしたいです。 ご回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
補足に示した書き方で大丈夫です。あとは***のところに適当な変数名を入れてください。 あるいは次のようにFor Eachの中でAs宣言しちゃっても大丈夫です。 Dim objItems As Object() = {"あ", "い"} For Each objItem As Object In objItems AddItem(ListBox1, objItem) Next
その他の回答 (2)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
#1 Wizard_Zeroです。以下、補足に対する回答です。 単純に考えれば、同じコトを2回やればよいだけです。その場合は、イベントメソッド内ではなく独立したメソッドにしたほうがコーディングの効率があがります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click AddItem(ListBox1, "あ") AddItem(ListBox1, "い") End Sub ' Controlに指定したリストボックスにItemを追加 ' すでにItemが存在している場合は削除する Private Sub AddItem(ByVal Control As Windows.Forms.ListBox, ByVal Item As Object) Dim intIndexOf As Integer = Control.Items.IndexOf(Item) Do While intIndexOf >= 0 Control.Items.RemoveAt(intIndexOf) intIndexOf = Control.Items.IndexOf(Item) Loop Control.Items.Add(Item) End Sub ただし、リストの項目数が多くなった場合にこの方法だと時間がかかってしまうかもしれませんね・・・。 (ためしに「あ」「い」「う」をそれぞれ1000個ずつ、合計3000アイテムに増やして上記コードを実行してみた結果、0.3秒ほどで処理できました。大して問題ないかも??)
補足
何度も何度も申し訳ないんですが 実際には「あ」「い」が同じ配列の中に代入されているので 配列を1行目から順番に処理するようにしたいんです。 例えば Dim 配列 As String() ={"あ", "い"} Dim *** As String For Each *** In 配列 AddItem(ListBox1,***) Next のようにすればできると思っているのですが 間違っているでしょうか。 For Each ~ Nextの使い方がよくわかっていないので たぶん間違っていると思います。 ご教授よろしくお願いします。
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
手順としては、 1. 同じ項目があるかを調べる。 2. 存在する場合はその項目を削除。 3. 1~2で削除する項目がなくなるまで繰り返し、項目を追加 となります。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ListBox1.Items.Add("あ") ListBox1.Items.Add("い") ListBox1.Items.Add("う") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 追加する項目 Dim strAddItem As Object = "あ" ' 追加する項目をリストから検索 Dim intIndexOf As Integer = ListBox1.Items.IndexOf(strAddItem) ' リストに項目が存在する限りループ Do While intIndexOf >= 0 ' 重複項目を削除 ListBox1.Items.RemoveAt(intIndexOf) ' 再び検索 intIndexOf = ListBox1.Items.IndexOf(strAddItem) Loop ' 項目を追加 ListBox1.Items.Add(strAddItem) End Sub
補足
では、もし リストボックスのアイテムが 「あ い う」 となっているときに 「い あ」 という項目を追加し、「い」と「あ」で重複チェックをかける場合はどうすればいいでしょうか。 strAddItemにそのまま入れてしまえばいいのでしょうか? ご回答よろしくお願いします。
お礼
解決しました! かなり頭を悩ませていたものだったので ちゃんと動作して気分爽快です! ご丁寧なご回答ありがとうございます!