2個のリストボックスの中身を比較して同じだったら消去するには?


VB初心者  2008-12-01 23:08:28  No: 140919

VB2005で2個のリストボックスから共通するテキストを削除するにはどうしたらいいのでしょうか?

Aのリストボックス            Bのリストボックス

あいうえお                    たちつてと
さしすせそ                    はひふへほ    
なにぬねの                    らりるれろ
かきくけこ                    あいうえお
まみむめも                    

このように入力されているとします
そしてAのリストボックスから「あいうえお」を選択して削除すると
Bのリストボックスからも「あいうえお」が削除されるようにしたいのですが
方法が分かりません

ちなみに自分が今作ってエラーになってしまうプログラムは

If ListBox1.Items.Count = 0 Then

            MessageBox.Show("クリップボードの中身がありません", "通知")

        ElseIf ListBox1.SelectedItem = Nothing Then

            MessageBox.Show("文章が選択されていません", "通知")

        Else

            Dim c As Integer = 0

            While ListBox2.Items.Count <> 0

                If ListBox1.SelectedItem = ListBox2.Items(c) Then

                    ListBox2.Items.Remove(ListBox2.Items(c))
                    ListBox1.Items.Remove(ListBox1.SelectedItem)

                    i -= 1

                Else
                    c += 1

                End If

            End While

        End If

    End Sub

このようになっています

自分がやっているつもりとしては
①Aのリストボックス1の選択しているテキストとBのリストボックスのc番目のテキストを比較
②同じだったらBのリストボックスのc番目のテキストとAのリストボックスの選択されているテキストを削除
③見つかったらiを-1
④見つからなかったらcを+1してBのリストボックス2の中身を再度比較

iはテキストをコピーまたは切り取りした時にAのテキストボックスにテキストを追加して+1しています
Aのリストボックスの要素数のつもりで使用しています

これで実行するとリストボックスに追加したテキストが1個の場合は両方から削除されますが2個以上テキストを追加するとエラーでプログラムが停止してしまいます
その際に

If ListBox1.SelectedItem = ListBox2.Items(c) Then
この部分でエラーが発生します

エラー詳細は

'2' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメータ名: index

となります
'2' の数字はリストボックスに追加したテキストの数によって変わります

どうにもお手上げの状態なのでどなたか分かる方はお願いしますm(_ _)m


YuO  2008-12-02 01:05:06  No: 140920

ステップ実行すればエラー原因は簡単に見つかると思いますが……。

ループから抜ける条件を満たすのはどういうときか,考えてみてください。


VB初心者  2008-12-02 01:30:47  No: 140921

YuOさん回答ありがとうございます

ループ条件は
Aのリストボックスの選択されているテキストとBのリストボックスの
テキストが同じじゃない間

又は

Aのリストボックスの要素数をBのリストボックスが越えない間

だと思いますが

ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i

このようにしてみましたがダメでした
どうしたらいいのでしょうか?


River  2008-12-02 01:47:44  No: 140922

上記のプログラムに" i -= 1"とありますが、プログラムを見た限り
何処にも"i"という変数が使われてませんよね。
なのに何故" i -= 1"という式がでてきたのかよくわからないのですが・・・。


YuO  2008-12-02 01:48:09  No: 140923

> Aのリストボックスの選択されているテキストとBのリストボックスの
> テキストが同じじゃない間
> 又は
> Aのリストボックスの要素数をBのリストボックスが越えない間

これは最初に提示されたソースコード上のどこに記述されているのですか?

> どうしたらいいのでしょうか?

上記の「条件」を,正しく記述してください。


VB初心者  2008-12-02 02:00:10  No: 140924

Riverさん

回答ありがとうございます
iはグローバル関数?ではじめに定義していて
コピー又は切り取りをしたときに+1するようにしています

定義した部分はこのソースには載せてませんでした^^;

Yu0さん

回答ありがとうございました

最初に提示されたソースコード上には記述していません

>ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i

>このようにしてみましたがダメでした

この部分でYu0さんのコメントを見てから
訂正したと伝えたつもりだったのですが^^;

>上記の「条件」を,正しく記述してください。

上にも記述したとおり
ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i
だと思って試してみましたが分からなかったので再度お聞きしたのです^^;


まろ  2008-12-02 09:01:02  No: 140925

>伝えたつもりだったのですが^^;
つもりがあっても実際に伝わってなきゃ意味が無いのですが^^;

>ダメでした
どう「ダメ」だったのか書いてもらえますか^^;

ところでWhileでループ回してるのには何か意味あるの?
指定した値消したいならIndexOfとか使えばよいのでは?


VB初心者  2008-12-02 18:26:20  No: 140926

まろさん

回答ありがとうございます

>つもりがあっても実際に伝わってなきゃ意味が無いのですが^^;
そうですね^^;
次回からもう少し鮮明に書くように心がけます^^;

>どう「ダメ」だったのか書いてもらえますか^^;
はじめと同じように'2' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメータ名: index
というエラーが出ます

>ところでWhileでループ回してるのには何か意味あるの?
>指定した値消したいならIndexOfとか使えばよいのでは?

自分のイメージとしてBのリストボックスを先頭から比較していって
見つけて削除するというものを最初に思いついたので
要素数を+1していってWhileで回してみようかなと^^;

そもそもIndexOfという関数すら知らなかったもので^^;
ちょっと調べてみてやってみます^^


VB初心者  2008-12-02 21:19:53  No: 140927

調べてみたんですが分からなかったので教えて下さいm(_ _)m

書式
    ★.indexOf(◆,◇) 
        ★=検索される文字 
        ◆=検索文字 
        ◇=検索開始位置 
文例
    pointer = "MacWinUNIX".indexOf("Mac",0) 
    pointer = document.title.indexOf("MZ",3) 
上位オブジェクト
    String 

このような内容が記述されているサイトを見つけたんですが
これの★◆◇の部分をそれぞれどのように変えたらいいのか分かりません

適当に自分なりに考えて

 Dim c As Integer = 0
            Dim pointer As Integer

            pointer = ListBox2.Items(c).IndexOf(ListBox1.SelectedItem)

            If pointer = -1 Then

                While pointer = -1 And c <= i

                    c += 1
                    pointer = ListBox2.Items(c).IndexOf(ListBox1.SelectedItem)

                End While

            End If

            TextBox1.Text = pointer

このようなものを作ってみました
このプログラムではまだ削除はしていませんが
今何番目を選択しているのかを確認するために最後に
pointerをTextBox1にいれてるんですが
何個テキストを登録して確かめても
全部要素が0番目になってしまいます

お助けお願いします><


YuO  2008-12-02 21:57:17  No: 140928

> このような内容が記述されているサイトを見つけたんですが

それは,
System.String.IndexOf
http://msdn.microsoft.com/ja-jp/library/system.string.indexof.aspx
の説明であって,今回問題になっている,
System.Windows.Forms.ComboBox.ObjectCollection.IndexOf
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.combobox.objectcollection.indexof.aspx
の説明ではありません。今回利用すべきは後者です。
ComboBox.ItemsのIndexOfメソッドを使ってください。

あと,プロジェクトオプションで
Option Explicit On
Option Strict On
を設定するようにしてください。
# 新規プロジェクトのデフォルト変更は,ツール - オプション -  プロジェクトおよびソリューション - Visual Basic の既定値


VB初心者  2008-12-04 22:35:27  No: 140929

YuOさん回答ありがとうございます

おそらく上級者のかたにしれみるとすばらしいアドバイスだと思うのですが
今の自分ではアドバイスしていただけてる内容の意味が理解できません><

少しだけソースを公開してもらえませんか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加