none
想請問關於listbox.Items中的Remove或RemoveAt所發生的問題 RRS feed

  • 問題

  •  

    想請問就是如下的狀況:
    listBox1.DataSource = list; (list是一個Arraylist)

    (如果我不是以DataSource的方式丟資料而是以listBox1.Add(Arraylist中的物件)的方式是OK的)

    在使用

    listBox1.Items.Remove(listBox1.SelectedItem);

    或listBox1.Items.RemoveAt(listBox1.SelectedIndex);

    時會丟出一個例外指出

    "提供給方法的其中一個引數無效時,所擲回的例外狀況。" 英文是 Value does not fall within the expected range.

     

    想請問這大概是發生了什麼狀況?

     

    謝謝

    2008年1月17日 上午 09:00

解答

  • 可以設定成Nothing之後再設定回來看看

            list.RemoveAt(ListBox1.SelectedIndex)
            ListBox1.DataSource = Nothing
            ListBox1.DataSource = list

     

    2008年1月18日 上午 02:04
    版主

所有回覆

  • 中文是:值不在給定的範圍之內。

    這樣你就應該知道要怎麼除錯了吧。

     

    2008年1月17日 上午 09:02
  •  

      Try
                Me.ListBox1.Items.Remove(Me.ListBox1.SelectedValue)
            Catch ex As Exception
                Response.Write(ex.Message)
            End Try
    2008年1月17日 上午 09:12
  •  

    首先謝謝小朱的回答

    非常抱歉,我知道英文訊息翻成中文是這樣子沒錯,但是我還是不知道我究竟參數為什麼放錯了?如果將listBox1.DataSource = list; 修改成

    foreach (Test obj in list)
           listBox1.Items.Add(obj);

    如果我將listbox中的項目以上述方式建構的話,則我使用listBox1.Items.Remove(參數與上面相同);方法是OK的,並不會發生問題,但是我不曉得只將上述程式碼改成listBox1.DataSource = list; (list是一個Arraylist)就會不行的原因是什麼,難道用這兩個方式建構然後以listBox1.SelectedItem存取到的東西會是不同的嗎?又如果不同,那我應該怎麼修改才能用listBox1.DataSource = list;來進行修改?

     

    to 真是有點難 您提供的方式只是將例外捕捉,還是沒有解決這個問題不過還是謝謝您。

    2008年1月17日 上午 11:15
  • ....

     

    如果用 listBox1.DataSource = list 無法直接做 Remove(),那試著用迂迴的方法做不也可以嗎:

     

    程式碼區塊

     

    listBox1.DataSource = list;

    ....

     

    int removeIndex = listBox1.SelectedIndex; // 取得選取的元素index。

    list.RemoveAt(removeIndex); // 直接在 list 中刪除元素。

    listBox1.DataSource = list;

    ...

     

     

    在文件上有寫說:

     

    ListBox.ObjectCollection.RemoveAt()

    這個方法支援 .NET Framework 基礎結構,但不建議直接使用於您的程式碼中。

     

    表示直接在程式中碼使用,可能會有不可預期的狀況發生。
    2008年1月17日 上午 11:26
  • 再次感謝您的回應,我測試的結果,這樣子還是會有些問題產生,首先透過list.RemoveAt()在刪除第一個list中項目的動作並將listBox1.DataSource = list(上面程式碼第二次)跑完之後畫面並不會更新(這邊有需要呼叫某個方法更新畫面嗎?),以致於舊的應該已經被刪除的項目還留在畫面中,產生了實際list中項目和listbox1所呈現的不同,然後如果再點選刪除同一個項目的話,就會因為點選了不在list中的資料進行刪除而發生錯誤(ex 如果以刪除最後一個項目為例)
    2008年1月18日 上午 01:30
  • 可以設定成Nothing之後再設定回來看看

            list.RemoveAt(ListBox1.SelectedIndex)
            ListBox1.DataSource = Nothing
            ListBox1.DataSource = list

     

    2008年1月18日 上午 02:04
    版主
  •  bauann 寫信:

    可以設定成Nothing之後再設定回來看看

            list.RemoveAt(ListBox1.SelectedIndex)
            ListBox1.DataSource = Nothing
            ListBox1.DataSource = list

     

     

    感謝 bauann,已透過您的方法測試並解決了問題。

    2008年1月24日 上午 09:29