【问题标题】:C# InvalidArgument = Value of '2' is not valid for 'index'C# InvalidArgument = \'2\' 的值对于 \'index\' 无效
【发布时间】:2022-12-03 08:51:05
【问题描述】:

我是 C# 的新手,我遇到了一个错误,指出:InvalidArgument='2' 的值对 'index' 无效。

如果列表框中有匹配项,我想设置检查列表框中的项目。 谁能帮我解决这个问题。

这是我的代码中出现问题的部分。

for (int i = 0; i < checklistbox.Items.Count; i++)
{
    if (checklistbox.Items[i].ToString() == listbox.Items[i].ToString())
     {
        //Check only if they match! 
        checklistbox.SetItemChecked(i, true);
     }
}

【问题讨论】:

  • 可能 listbox.Items 只有 2 个元素,而您正在尝试访问第三个元素。
  • 是的,它只有 2 个元素
  • checklistboxlistbox 应该具有相同数量的元素才能正常工作。请记住,C# 数组是从零开始的。
  • 我有另一组代码,checkedlistbox 的元素是 4,而 listbox 是 2,但它仍然有效

标签: c# winforms listbox checkedlistbox


【解决方案1】:

您只需要使用嵌套的 for 循环。这是代码。

 for (int i = 0; i < listbox.Items.Count; i++)
 {
   for (int j = 0; j < checkedlistbox.Items.Count; j++)
   {
     if (listbox.Items[i].ToString() == checkedlistbox.Items[j].ToString())
     {
       //Check only if they match! 
       checkedlistbox.SetItemChecked(i, true);
     }
   }
 }

【讨论】:

  • 谢谢你,它有效。
【解决方案2】:

您收到此错误的原因是因为您正在循环检查清单框项目的计数。因此,例如,如果该数组中有 3 个项目,而列表框只有 2 个项目,那么在第三个循环中(当 i = 2 时),您将尝试引用列表框数组中不存在的项目。

另一种方法是这样的:

foreach (var item in listbox.Items)
        {
            if (Array.Exists(checklistbox.Items, lbitem => lbitem.ToString() == item.ToString()))
            {
               //They match! 
               checklistbox[item].MarkAsChecked()
            }
        }

更新:更新答案以添加 MarkAsChecked() 并循环遍历清单数组中保存的用户输入值。

【讨论】:

  • 很抱歉,但这并不能解决我的问题。如果列表框中有匹配项,我希望检查 checkedlistbox 中的项目。我程序的流程是,用户输入元素然后将其显示在列表框中,然后如果输入的元素与checkedlistbox中的预定义元素匹配,则将检查该元素。这就是为什么 checkedlistbox 和 listbox 的索引不匹配的原因。
  • 好的,您应该通过使用我的答案中的语法循环遍历用户输入值(保存在列表框中)而不是循环遍历检查列表框中可能是大量项目的列表,然后在找到匹配项时,应该有找到匹配项时调用的 checkedListBox 类上的方法(函数)。像 checkedListBox[i].MarkAsChecked() 这样的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多