2012-07-19 69 views
2

這工作得很好:列表框中將selectedItem問題

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < listBox1.SelectedItems.Count; i++) 
    { 
     listBox1.Items.Remove(listBox1.SelectedItems[i].ToString()); 
     i--; 
    } 
} 

但是,這並不工作:

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    listBox1.Items.Remove(listBox1.SelectedItems); 
} 

爲什麼不工作的第二btnDelete_Click?我的意思是我用我的鼠標在我的listBox1上選擇一條線,然後按下按鈕。 .Remove函數不能識別我選擇哪條線?即使我說.Remove(listBox1.SelectedItem),它是必須擁有和selectedItem數組?是不是SelectedItems這個詞不言自明?而且,由於我用我的鼠標點擊了我的listBox1上的這一行,程序或IDE是否不知道哪一行被選中?爲什麼我仍然需要使用SelectedItems[i]

+0

出於興趣,你爲什麼要在第一個調用'ToString()'?刪除方法需要類型'object'。 – 2012-07-19 11:34:39

+0

,你爲什麼要做I--,你循環所有的項目,並鎖定循環刪除I--;或向我解釋爲什麼你這樣做,看到我的回答 – JohnnBlade 2012-07-19 11:36:24

+0

是巴厘島C ur右邊沒有需要的ToString() – 2012-07-19 11:40:35

回答

1

第二個例子不工作的原因是因爲你試圖以集合的形式傳遞多個項目以立即被刪除。

要刪除你需要做一次一個項目,因此爲什麼你需要一個循環。

另外,我可以建議使用ListView來代替嗎?我個人發現他們更容易使用更多的選擇。

例如,你可以只用這

foreach (ListViewItem item in listView1.SelectedItems) 
{ 
    item.Remove(); 
} 

讓你的循環爲ListView如果你想在這個被選中,那麼你做

listBox1.Items.Remove(listBox1.SelectedItem); 

SelectedItem一次只刪除一個項目而不是SelectedItems,複數是它沒有循環無法處理的集合,單數是它可以理解的單個項目。

+0

確定巴厘島C感謝ListView的東西。你指出它似乎更容易。和你給我的原因我沒有選擇多行。並且我沒有打開該屬性,我只能選擇一行不是多個,而我只能刪除一個項目。不是多個項目。對不起,如果我明白你錯了。你有沒有更深的說法或解釋。謝謝。 – 2012-07-19 12:06:36

+0

好吧,現在看到我的答案,希望能回答你的問題,如果我明白了:) – 2012-07-19 12:12:19

+1

感謝巴厘島C現在它的清晰,我想在這裏感謝你們所有加入我的問題和啓發。 – 2012-07-19 12:23:28

1

我認爲SelectedItems需要indegs數字。 也許這就是爲什麼你不能刪除任何項目。

+0

是的,因爲我從經驗中得知它需要索引號,但爲什麼?即時選擇線和我使用。刪除不能程序或IDE明白嗎?爲什麼我需要提供索引號?這就是問題所在!!! – 2012-07-19 11:31:33

1

listBox1.SelectedItems返回所選項目的集合。要刪除項目,只能傳入集合中的單個對象,使用Remove(),或者通過RemoveAt()收集集合中對象的索引。

刪除的對象:

listBox1.Items.Remove(listBox1.SelectedItem); 

在索引中刪除的對象:

listBox1.Items.RemoveAt(5); 

沒有RemoveRange()方法,這是你在找什麼。

1

也改變

for (int i = 0; i < listBox1.SelectedItems.Count; i++) 
{ 
    listBox1.Items.Remove(listBox1.SelectedItems[i].ToString()); 
    i--; 
} 

for (int i = (listBox1.SelectedItems.Count - 1); i >= 0; i--) 
    { 
     listBox1.Items.Remove(listBox1.SelectedItems[i]); 
    } 

,這應該是

listBox1.Items.Remove(listBox1.SelectedItem); 
+0

你看過這個問題嗎?我已經知道哪個人在工作john和im不在尋找更正?我已經經歷過,我需要給和索引號碼,但爲什麼?我解釋了我的問題。你能否再次閱讀並感謝我。 – 2012-07-19 11:37:03

+0

你爲什麼加上i--;它不需要,除非你想循環卡在索引0 – JohnnBlade 2012-07-19 11:39:16

+0

至少它的一個奇怪的做法 – JohnnBlade 2012-07-19 11:39:34

1

ListBox.Items.Remove()預計一個單一項目,同時ListBox.SelectedItems換貨政刪除rns a 收集的項目SelectedObjectCollection) - 即使只有一個項目被選中!

你可以寫一個擴展方法,將全部刪除選定的項目:

public static class ListBoxExtension 
{ 
    public static void RemoveSelectedItems(this ListBox source) 
    { 
     if(source==null) return; 
     while(source.SelectedItems.Count!=0) 
     { 
      source.Items.Remove(source.SelectedItems[0]); 
     } 
    } 
} 

這可以用於這樣的:

this.listbox1.RemoveSelectedItems(); 
+0

我試過this.listBox1.RemoveSelectedItems();但它不起作用。在this.listBox1之後。沒有像RemoveSelectedItems()這樣的東西 – 2012-07-19 11:54:07

+0

是的,這就是爲什麼你需要定義擴展方法。 – 2012-07-19 11:55:40

+0

有,其擴展方法,將所有複製到一個新的類,然後你會看到一個擴展方法添加到您的列表框 – JohnnBlade 2012-07-19 11:55:40