原因是遍历ListBox中的Items的时候同时操作Item.
解决办法就是改foreach()遍历Items为for()遍历Item[i]
///
<summary>
/// 设置ListBox选中项
/// </summary>
/// <param name="listBox"></param>
/// <param name="selStr"></param>
private void SelListBox(System.Windows.Forms.ListBox listBox, string selStr)
{
// foreach (object obj in listBox.Items)
// {
// if (obj.ToString() == selStr)
// {
// listBox.SelectedItems.Add(obj);
// }
// }
for ( int i = 0; i < listBox.Items.Count; i++)
{
if (listBox.Items[i].ToString() == selStr)
{
listBox.SelectedItems.Add(listBox.Items[i]);
}
}
}
/// 设置ListBox选中项
/// </summary>
/// <param name="listBox"></param>
/// <param name="selStr"></param>
private void SelListBox(System.Windows.Forms.ListBox listBox, string selStr)
{
// foreach (object obj in listBox.Items)
// {
// if (obj.ToString() == selStr)
// {
// listBox.SelectedItems.Add(obj);
// }
// }
for ( int i = 0; i < listBox.Items.Count; i++)
{
if (listBox.Items[i].ToString() == selStr)
{
listBox.SelectedItems.Add(listBox.Items[i]);
}
}
}
调用此方法等效于将 SelectedIndex 属性设置为负一 (-1)。
可以使用此方法快速取消选择列表中的所有项。
foreach( object d in listBox2.SelectedItems)
这一行有问题,当删除其中一个选项时,listBOx的所选项已经被更改了,再调用foreach,当然会有问题!
for (
int i=listBox1.Items.Count-
1; i>-
1; i--)
{
if (listBox1.GetSelected(i))
{
listBox1.Items.RemoveAt(i);
}
}
{
if (listBox1.GetSelected(i))
{
listBox1.Items.RemoveAt(i);
}
}
1。 GetSelected(i) 获得选中的状态
2。 循环遍历需要用倒序, 不然删除选项后, index会变化, 造成后删除的序号错误。
url: http://greatverve.cnblogs.com/archive/2012/07/31/foreach-listbox.html