- PR -

ListBoxの項目を選択した時、ArgumentOutOfRangeが発生する

投稿者投稿内容
いつき
会議室デビュー日: 2004/01/08
投稿数: 9
お住まい・勤務地: 神奈川県
投稿日時: 2004-03-04 09:36
環境:WinXP,VS2003
言語:VB.NET

はじめまして。VB.NETを触って3ヶ月目のいつきと申します。
早速ですが、ListBoxのDataSourceにArrayListを指定して、一つの項目を選択した時にArgumentOutOfRangeExceptionが発生しています。一日解決策を模索したのですが解決できなかったので、ご教授いただきたく投稿します。
やりたいことは、左右のリストボックスの項目を<追記>選択し、ボタンクリックで</追記>移動することです。

以下に再現できるソースを記します。以下のソースを実行すると左右に10個ずつItemが表示されます。これを9個移動して<追記>9個移動=下から9個選び、移動ボタンをクリックします</追記>、残りの1個を選択する時にArgumentOutOfRangeExceptionが発生します。
ArrayListの中身はサンプルではStringですが、実際はIDとNameとToString()を持った構造体です。

-------------------------------------------------------
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
 '〜略〜
 'FormにはListBoxが2つと、Buttonが2つあります。
 '注)ListBoxのSelectionModeはMultiExtendedです。
#End Region

    Dim al1 As New ArrayList
    Dim al2 As New ArrayList

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 0 To 9
            al1.Add(i.ToString)
        Next
        For i As Integer = 10 To 19
            al2.Add(i.ToString)
        Next

        Me.ListBox1.DataSource = al1
        Me.ListBox2.DataSource = al2
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each s As String In Me.ListBox1.SelectedItems
            al2.Add(s)
            al1.Remove(s)
        Next
        Me.ListBox1.DataSource = Nothing
        Me.ListBox1.DataSource = al1
        Me.ListBox2.DataSource = Nothing
        Me.ListBox2.DataSource = al2
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        For Each s As String In Me.ListBox2.SelectedItems
            al1.Add(s)
            al2.Remove(s)
        Next
        Me.ListBox1.DataSource = Nothing
        Me.ListBox1.DataSource = al1
        Me.ListBox2.DataSource = Nothing
        Me.ListBox2.DataSource = al2
    End Sub
End Class



[ メッセージ編集済み 編集者: いつき 編集日時 2004-03-04 13:05 ]
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-04 10:20
考えられるとしたら
1)空のArrayListをDataSourceに設定しているのがまずい
2)選択状態が残っているのにDataSourceを再設定しているのがまずい

おそらく2)だと思いますので
ClearSelectedで選択状態をクリアしてみたらどうなります?
いつき
会議室デビュー日: 2004/01/08
投稿数: 9
お住まい・勤務地: 神奈川県
投稿日時: 2004-03-04 10:33
ゆうじゅんさん、レスありがとうございます。

[元]
1:Me.ListBox1.DataSource = Nothing
2:Me.ListBox1.DataSource = al1
3:Me.ListBox2.DataSource = Nothing
4:Me.ListBox2.DataSource = al2

[改]
1:Me.ListBox1.ClearSelected()
2:Me.ListBox1.DataSource = Nothing
3:Me.ListBox1.DataSource = al1
4:Me.ListBox2.ClearSelected()
5:Me.ListBox2.DataSource = Nothing
6:Me.ListBox2.DataSource = al2

[元]のように書いていた部分を[改]のようにして実行したところ、
データの移動中に[改]の1:でOutOfRangeが発生しました。

ゆうじゅんさんのおっしゃる1)は「ListBox1.DataSource = Nothing」がまずいということでしょうか?最初はなにも指定していなかったのですが、それだと変更がListBoxに反映されなかったのでこのようにしています。問題の起こる可能性がある…ということですよね?
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-04 11:04
以下のように変更してみたらどうなりますか?

1:Me.ListBox1.DataSource = Nothing
2:Me.ListBox1.ClearSelected()
3:Me.ListBox1.DataSource = al1
4:Me.ListBox2.DataSource = Nothing
5:Me.ListBox2.ClearSelected()
6:Me.ListBox2.DataSource = al2

Nothing自体は問題ないと思います。
いつき
会議室デビュー日: 2004/01/08
投稿数: 9
お住まい・勤務地: 神奈川県
投稿日時: 2004-03-04 11:18
1:Me.ListBox1.DataSource = Nothing
2:Me.ListBox1.ClearSelected()
3:Me.ListBox1.DataSource = al1
4:Me.ListBox2.DataSource = Nothing
5:Me.ListBox2.ClearSelected()
6:Me.ListBox2.DataSource = al2

以上の順番で試したところ、9個の項目を移動後、残りの1個を選択した時にOutOfRangeが発生しました。(最初の投稿の時と同じタイミングです)
落ちる直前(MouseDownイベント時)には、ArrayList2はLength=1で、Item(0)に値が入っています。ListBox2のItemsもCount=1です。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-04 12:02
C#ですがサンプルどおりでも問題なく動きますね。
なにかイベント処理しているとかないですか?
それともVBだと何かあるのかな
いつき
会議室デビュー日: 2004/01/08
投稿数: 9
お住まい・勤務地: 神奈川県
投稿日時: 2004-03-04 12:53
上記サンプルはVB.NETで問題を再現したコードをそのままコピペしたものなんですが、C#では動くんですね。
コードは、上記サンプルですべてです。省略したのはデザイナで自動生成されるコードのみです。
デザイナでの設定もコメントとして書き込んであるとおりです。

なにが問題なんでしょうか…?

最初はコレ↓が原因かとも思ったんですが、2003だし、Insertなんて使ってないですからねぇ。
http://support.microsoft.com/default.aspx?scid=kb;ja;814320

[ メッセージ編集済み 編集者: いつき 編集日時 2004-03-04 12:58 ]
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-04 13:11
C#でも再現しました。
一番最後の項目を移動してからその上の項目を選択するとおかしくなるみたいです。

スキルアップ/キャリアアップ(JOB@IT)