索引超出了CheckedListBox中数组的边界

本文关键字:数组 边界 CheckedListBox 索引 | 更新日期: 2023-09-27 18:17:51

我在else if语句上得到索引错误,但我无法找到原因。

我所做的是遍历CheckedListBox,如果没有值被选中,则打印错误,否则在MessageBox中显示所选值。

有人能帮我吗?谢谢你!
for (int i = 0; i < checkedListBox1.Items.Count; i++)
if (checkedListBox1.CheckedItems.Count == 0) 
{
  Empty.SetError(checkedListBox1, "Please select at Least One");
  return;
}
else if (checkedListBox1.GetItemChecked(i))
{
   MessageBox.Show(checkedListBox1.CheckedItems[i].ToString());
}

索引超出了CheckedListBox中数组的边界

Count - check移到循环前:

 if (checkedListBox1.CheckedItems.Count == 0)
 {
    Empty.SetError(checkedListBox1, "Please select at Least One");
    return;
 }
但重要的部分是,您正在循环所有项。然后检查每一项是否与GetItemChecked核对。这很好,但是您使用checkedListBox1.CheckedItems[i],它不包含所有项,而只包含检查的项。这就是为什么你会得到索引超出边界错误。

你只需要使用这个集合而不是循环all:

for(int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
{
    MessageBox.Show(checkedListBox1.CheckedItems[i].ToString());
}

你应该改变

i < checkedListBox1.Items.Count;

:

i < checkedListBox1.CheckedItems.Count;

checkedListBox1.CheckedItems[i]是问题所在。循环遍历所有项,但索引CheckedItems。因此,当您有10个项目并检查了第2项和第8项时,CheckedItems将只有两个项目,但您将访问CheckedItems[7],这就是为什么会出现异常。

使用CheckedItems collection直接访问检查项

if (checkedListBox1.CheckedItems.Count == 0)
{
    Empty.SetError(checkedListBox1, "Please select at Least One");
    return;
}
foreach (var checkedItem in checkedListBox1.CheckedItems)
{
    MessageBox.Show(checkedItem.ToString());
}

为什么要检查CheckedItems ?在for循环中计数?

将If子句的第一部分置于For循环之外。

最后你的代码看起来像这样:

 if (checkedListBox1.CheckedItems.Count == 0)
 {
    Empty.SetError(checkedListBox1, "Please select at Least One");
 }
 for (int i = 0; i < checkedListBox1.Items.Count; i++)
   if (checkedListBox1.GetItemChecked(i))
   {
     MessageBox.Show(checkedListBox1.Items[i].ToString());
   }