索引超出了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());
}
将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());
}