| 屬性/方法 | 型別 | 用途 | 備註 |
|---|---|---|---|
listBox.Items | ListBox.ObjectCollection | 操作所有項目的來源集合 | 支援索引、物件刪除 |
listBox.SelectedItems | ListBox.SelectedObjectCollection | 僅包含目前被選取的項目 | 唯讀集合,無 Remove 方法 |
結論:SelectedItems 是唯讀檢視,**不能直接呼叫 Remove**;必須對 Items 操作。
if (listBox1.SelectedIndex != -1) {
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
// 或
listBox1.Items.Remove(listBox1.SelectedItem);
}
因刪除會改變索引,**必須從後往前刪**或先收集再刪:
// 寫法一:倒序索引刪除
for (int i = listBox1.SelectedIndices.Count - 1; i >= 0; i--) {
listBox1.Items.RemoveAt(listBox1.SelectedIndices[i]);
}
// 寫法二:收集物件再刪除(推薦,語意清晰)
var toRemove = listBox1.SelectedItems.Cast<object>().ToList();
foreach (var item in toRemove) {
listBox1.Items.Remove(item);
}
private void button2_Click(object sender, EventArgs e) {
if (listBox1.SelectedItems.Count == 0) {
MessageBox.Show("當前沒有選擇內容", "提示");
return;
}
// 錯誤:listBox1.SelectedItems.Remove(...); // 編譯錯誤
// 正確:
var items = listBox1.SelectedItems.Cast<object>().ToList();
foreach (var item in items) listBox1.Items.Remove(item);
}
若 DataSource 綁定 BindingList<T> 或 List<T>,請操作資料源而非 Items:
var src = (BindingList<MyItem>)listBox1.DataSource;
var selected = listBox1.SelectedItems.Cast<MyItem>().ToList();
foreach (var item in selected) src.Remove(item);
記住:Items 才是可寫入的集合,SelectedItems 只是選取檢視。