2013-08-21 88 views
2

我有一個列表視圖,我想要按按鈕被刪除所選項目。另外,我使用該項目進行其他一些操作。基本上,我使用項目字符串的一些字母來匹配文件並將其刪除。這工作,如果所選擇的項目是在ListView的第一個,但沒有按」 T工作,如果它是第二,第三等無效的參數值'1'對'索引'無效

private void delete_button_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
    if (listView1.Items[i].Selected) 
     { 
     string var1 = listView1.SelectedItems[i].ToString(); //error 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items[i].Remove(); 
     i--; 
     } 
    } 
} 

它thorws錯誤

ArgumentOutofRangeException沒有處理」 - 無效參數值「1」 是無效的「索引」

我不明白出了什麼問題,爲什麼它的工作原理,只有當它的第一個項目。

回答

2

所選項目只包含選定的項目,但您正在迭代整個集合。

for (int i = 0; i < listView1.Items.Count; i++) 
    { 
    if (listView1.Items[i].Selected) 
     { 
     string var1 = listView1.Items[i].ToString(); // <------- 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items[i].Remove(); 
     i--; 
     } 
    } 
2

我認爲問題在於,您的索引增加,而listView1.Items正在變小。

2

您檢查Items先從但隨後覈對SelectedItems

指數如果在Items 4個元素,只有4被選中,那麼SelectedItems有1個項目,但i將4

for (int i = 0; i < listView1.SelectedItems.Count; i++) 
    { 
     string var1 = listView1.SelectedItems[i].ToString(); 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items[i].Remove(); 
     i--; 
     } 
    } 
2

var1需要從Items而不是從SelectedItems。就像這樣:

private void delete_button_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
    if (listView1.Items[i].Selected) 
     { 
     string var1 = listView1.Items[i].ToString(); //NOTE THE DIFFERENCE 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items[i].Remove(); 
     i--; 
     } 
    } 

其實不過,更好的方法來做到這一點會是這樣的:

private void delete_button_Click(object sender, EventArgs e) 
{ 
    foreach (var x in listView1.SelectedItems.Select(x => x)) 
    listView1.Items.Remove(x); 
} 
1

這是因爲你是通過在列表框中的項目迭代,而不是選定項目。例如,如果您在框中有10個項目,並且您選擇了2個項目,則當它進入thrird迭代時將失敗。

0

用這一個,而不是你的代碼:

foreach(var item in listView.SelectedItems){ //todo } 
0

如果你只用選擇的集合爲什麼你迭代所有元素?

只是這樣做。

foreach(var var1 in listView1.SelectedItems.ToArray()) 
    //the to array is to create e new collection from the list else you get one error when you change it. 
    { 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items.Remove(var1); 
    } 
0

試試這個;

for (int i = listView1.Items.Count-1; i >=0 ; i--) 
    { 
    if (listView1.Items[i].Selected) 
     { 
     string var1 = listView1.SelectedItems[i].ToString(); //error 
     string var2 = var1.Substring(31, 5); 
     ... // code for other actions 
     listView1.Items[i].Remove(); 

     } 
    }