我在删除一个listbox中的item时候,采用以下函数:
private void btnRemoveCooperators_Click(object sender, System.EventArgs e)
{
int coopId;
for(int i=0;i<this.lstCooperatorsChoose.SelectedItems.Count;i++)
{
coopId=int.Parse(((CooperatorAll)(this.lstCooperatorsChoose.SelectedItems[i])).CooperatorId.ToString());
//MessageBox.Show(coopId.ToString());
for(int k=0;k<this.arrayCoop.Count;k++)
{
if(((CooperatorAll)(this.arrayCoop[k])).CooperatorId==coopId)
{
this.arrayCoop.RemoveAt(k);
break;
}
}
}
//MessageBox.Show(this.lstCooperatorsChoose.SelectedIndex.ToString());
this.lstCooperatorsChoose.DataSource=null;
this.lstCooperatorsChoose.DataSource=arrayCoop;
this.lstCooperatorsChoose.DisplayMember="CooperatorName";
this.lstCooperatorsChoose.ValueMember="CooperatorId";
}
当运行起来后,顺着依次删除的时候,没有问题。可是,每当我从中间任一个项删除后,依次删除到最后,然后我再返回选择上面没有删除的项目时候,就出现如下错误:
未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。其他信息: 索引超出范围。必须为非负值并小于集合大小。
请高手指教原因何在?谢谢!

解决方案 »

  1.   

    for(int k=0;k<this.arrayCoop.Count;k++)
    {
    。。
    }改为for(int k = this.arrayCoop.Count - 1;k>=0 ;k--)
    {
    ...
    }
      

  2.   

    我再具体说一下吧:
    现在有两个listbox,一个lstAll,一个lstChoose,现在需要把lstAll中的内容选到lstChoose中,或者从已经选择的lstChoose中删除选定的项。
    【其中lstAll中的内容是直接从数据集中读出,即设置lstAll.DataSource】
    我的设计思路是,先设计一个类A,内有两个字段,一个int类型,以后作为listbox的valuemember,一个string类型,以后作为listbox的displaymember。然后建立动态数组,其中的每个元素为选中的lstAll中的item,因为其格式为DataRowView,但内容也为int和string,故依次取出其内容,生成类A的实例,作为此动态数组的元素。
    在向lstChoose中添加内容时候,我先修改动态数组的内容,然后设置lstChoose的datasource为null,再设置为此数组,即相当于更新一下,一切运行正常。
    依照此思路减少lstChoose中的内容。在运行的时候,如果我是从上到下依次删除lstChoose中选定的项时候,没问题。但是,如果我从中间任一项目向下删除或者一开始就删除lstChoose中最底端的选项时候,删除时候没有问题,但是,当我再用鼠标去选择lstChoose中剩余的选项的时候,即出现以下错误:
    未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。其他信息: 索引超出范围。必须为非负值并小于集合大小。请高手指教问题到底出在哪里?
      

  3.   

    我用另一种思路已经解决,直接把item定义成相应得类实例,然后在删除时候注意selectedindice要从大到小引用。
    结贴。