你选中的是最后一行。但随之你又将它删除。listBox的SelectIndex已经没有了。
删除后向上移一项,再绑定(仅最后一项时。)
所以报错。不知是不是这样。

解决方案 »

  1.   

    to :  gkwww(奔放) 差不多,知识删除之后就马上重新绑定,看上面的代码!!!
    to : xinshaw(清瘦卫郎)错误的断点在:下面的最后一个符号  “}”
    问题是错的没有什么理由!!!static void Main() 
    {
    Application.Run(new Form1());
    }
      

  2.   

    其实你没有必要每添加或删除一次都重新绑定一次,这样会造成不必要的刷新。
    你只需要在List中添加一项,或删除选定项即可
      

  3.   

    假设删除最后一个选择项前,listBox1.SelectedIndex == 3,删除后其值不变,仍为3,将超过Items的范围(因为刚刚已经删除了一个)。代码改为:                 private void btnDEL_Click(object sender, System.EventArgs e)
    {
    myListData.Remove(listBox1.SelectedItem);
    listBox1.DataSource=null;
    listBox1.DataSource=myListData;
    listBox1.DisplayMember="strTXT";
    listBox1.ValueMember="strVAL";                           //添加if语句,重新设置SelectedIndex值
                               if (listBox1.SelectedIndex != 0)                       listBox1.SelectedIndex=0;
    }
      

  4.   

    to "其实你没有必要每添加或删除一次都重新绑定一次,这样会造成不必要的刷新。
    你只需要在List中添加一项,或删除选定项即可"我要的是每项的两个值,,所以才采用数据源绑定
    to "BillKang(寂寞惯了)"我试过了,不行的,我直接用 SelectedIndex = -1;  试过也不行;;;
    我甚至 : listData ld=(listData)listBox1.SelectedItem;
    listBox1.DataBindings.Clear();
    listBox1.DataSource=null;
    myListData.Remove(ld);
    listBox1.DataSource=null;
    listBox1.DataSource=myListData;
    listBox1.DisplayMember="strTXT";
    listBox1.ValueMember="strVAL";
    把listBox1和dataSource全部断开,再在DataSource中去移除数据,
    然后再绑定。从理论上讲 此时 listBox1 绑定的是一个新的数据源了。
    可是也不行!真纳闷!!!!!只有在两个项以上删除最后一项才出现错误,,,是否是常见的 “临界值 ”值班错误的问题???
      

  5.   

    程序应该有必要的容错和处理异常的能力是不是错是肯定有 可不是.net的bug
      

  6.   

    将上面的if语句提前到
    myListData.Remove(listBox1.SelectedItem);
    的前面试试
      

  7.   

    我试过了,按上面我的方法(将If语句提前),可以解决你的这个问题。
    但是,你的程序还有其它问题,比如删除操作中的remove方法。
      

  8.   

    to 
    "我试过了,按上面我的方法(将If语句提前),可以解决你的这个问题。"
    这样是不会发生错误,可是却不是 删除 最后的那笔记录了!!!
    而每次删除的都是 第一笔记录!我加上 条件   if (myListData.Count>0 && listBox1.SelectedIndex >=0 ) 再执行删除也不行。。
      

  9.   


    int i = this.listBox1.SelectedIndex;
    this.listBox1.SelectedIndex = 0;
    myListData.RemoveAt(i);
    listBox1.DataSource=null;
    listBox1.DataSource=myListData;
    listBox1.DisplayMember="strTXT";
    listBox1.ValueMember="strVAL";
      

  10.   

    多谢   BillKang(寂寞惯了)
    了!!!  int i =listBox1.SelectedIndex;
    listData ld=(listData)listBox1.SelectedItem;
    if (i==myListData.Count-1) 
    listBox1.SelectedIndex=myListData.Count-2;
    myListData.Remove(ld);
    listBox1.DataSource=null;
    listBox1.DataSource=myListData;
    listBox1.DisplayMember="strTXT";
    listBox1.ValueMember="strVAL";就没有问题,而且还很符合删除后的记录移动。
    只是   listBox1 在用 listBox.DataSource =null;
    之后再重新绑定,按道理上讲 就不应该出现这样的错误。。
    是否listBox1和一个数据源绑定之后,背后还有什么机制
    哪位给予指点???
      

  11.   

    你可以跟踪一下重新绑定数据源后listBox1.SelectedIndex的值(不要手工设定)
      

  12.   

    看样子是 microsoft 一个有关使用 datasource 的 bug
    我稍微改了一点代码实现你想要的功能,绕过这个bug private void setListDataSource()
            {
                ArrayList lvArrayList = new ArrayList();
                lock (myListData.SyncRoot)
                {
                    foreach (Object item in myListData)
                    {
                        lvArrayList.Add(item);
                    }
                }
                listBox1.DataSource = lvArrayList;
                listBox1.DisplayMember = "strTXT";
                listBox1.ValueMember = "strVAL";
            }
            private void btnADD_Click(object sender, System.EventArgs e)
    {
                myListData.Add(new listData(textBox1.Text, "VALUE"));
                setListDataSource();
            }
    private void btnDEL_Click(object sender, System.EventArgs e)
    {
                myListData.Remove(listBox1.SelectedItem);
                setListDataSource();
            }
      

  13.   

    有仔细看了一下,引起错误的原因是: SelectedIndex 属性必须是一个有效的值 ,即必须在好面的 datasource 中存在,所以设置 -1 会失败,但是有一个奇怪的事情:调用 ClearSelected()方法之后, SelectedIndex 值却是 -1,在一个单独的button 事件中调用 ClearSelected()没有问题,放在上面的 Detele 事件代码中调用却有问题
     看样子还是 microsoft 的 bug,
      

  14.   

    多谢 longx ,
    让咱学到东西了!!!
      

  15.   

    从道理上讲,本来把 listBox1 与 数据源断开后。
    重新绑定,也就是listBox1 应该相当 第一此绑定,也就不应该出现改错误!
    但我弄不明白其中的缘由,,,多谢 longx 赐教!!!
    下周结贴!
      

  16.   

    应该是使用的经典错误----------------------------------------------------------------------
    欢迎试用ASP.NET大文件上传组件(AspnetUpload 1.0 Release & 无刷新进度条)
    http://bestcomy.europe.webmatrixhosting.net
    ----------------------------------------------------------------------
      

  17.   

    for(int i=Items;i>0;i--)
    {
    }