- - PR -
ListBoxの項目を選択した時、ArgumentOutOfRangeが発生する
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-03-04 10:20
考えられるとしたら
1)空のArrayListをDataSourceに設定しているのがまずい 2)選択状態が残っているのにDataSourceを再設定しているのがまずい おそらく2)だと思いますので ClearSelectedで選択状態をクリアしてみたらどうなります? |
|
投稿日時: 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-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-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-03-04 12:02
C#ですがサンプルどおりでも問題なく動きますね。
なにかイベント処理しているとかないですか? それともVBだと何かあるのかな |
|
投稿日時: 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-03-04 13:11
C#でも再現しました。
一番最後の項目を移動してからその上の項目を選択するとおかしくなるみたいです。 |