日期:2014-05-17  浏览次数:21008 次

C# CheckedListBox移除打钩项的问题
我使用OldCheckListBox.Items.Remove(OldCheckListBox.CheckedItems[i]);函数只能把值去掉,然后又出现异常了,说索引超出了数组界限,怎么解决这个问题,



public static void GetListFromCheckListBoxToAnother(CheckedListBox OldCheckListBox, CheckedListBox TargetCheckListBox)
        {
            
            for (int i = 0; i < OldCheckListBox.CheckedItems.Count; i++)
            {
                bool CheckItem = false;
                for (int j = 0; j < TargetCheckListBox.Items.Count; j++)
                {
                    if (OldCheckListBox.CheckedItems[i].ToString()==TargetCheckListBox.Items[j].ToString())
                    {
                        CheckItem = true;
                        break;
                    }
                }
                if (CheckItem == true)
                {

                }
                else
                {
                    OldCheckListBox.Items.Remove(OldCheckListBox.CheckedItems[i]);
                    
                    TargetCheckListBox.Items.Add(OldCheckListBox.CheckedItems[i].ToString());
                }
            }
        }
c#

------解决方案--------------------
因为你remove一次,OldCheckListBox.CheckedItems.Count实际会减少一次,而你i往后增加,会导致超出OldCheckListBox.CheckedItems.Count值

举个例子,刚开始OldCheckListBox.CheckedItems.Count=3,相当于
for(int i=0;i<3;i++)
   OldCheckListBox.CheckedItems.Remove(i); //你想想,到i=2时,这句是不是要报错?

而倒过来循环就不会了