for (int i = 0; i < CheckBoxList3.Items.Count + 1; i++)
{
if (CheckBoxList3.Items[i].Selected || CheckBoxList4.Items[i].Selected || CheckBoxList5.Items[i].Selected)
{
str1 += CheckBoxList3.Items[i].Text.ToString() + "," + CheckBoxList4.Items[i].Text.ToString() +"," + CheckBoxList5.Items[i].Text.ToString() + ",";
我收到错误消息“索引超出范围。必须为非负数并且小于集合的大小。 参数名称:index”。如何解决此问题?
我要做的是从多个复选框列表中的复选框中收集数据,并将其组合在一起并存储到数据库中。
任何建议或帮助都会很棒。谢谢
更新:这是我的复选框列表之一。错误指向我的for循环的第二行。
<asp:CheckBoxList ID="CheckBoxList3" runat="server" RepeatDirection="Horizontal" Width="900px">
<asp:ListItem>Chicken</asp:ListItem>
<asp:ListItem>Tomato</asp:ListItem>
<asp:ListItem>Garlic</asp:ListItem>
</asp:CheckBoxList>
答案 0 :(得分:1)
错误的第1行:
for (int i = 0; i < CheckBoxList3.Items.Count + 1; i++
第2行错误:
CheckBoxList3.Items[i].Selected || CheckBoxList4.Items[i].Selected || CheckBoxList5.Items[i].Selected
第3行错误:
str1 += CheckBoxList3.Items[i].Text.ToString() + "," + CheckBoxList4.Items[i].Text.ToString() +"," + CheckBoxList5.Items[i].Text.ToString() + ",";
您需要将for循环条件从CheckBoxList3.Items.Count + 1
更改为CheckBoxList3.Items.Count
您的条件也仅检查CheckBoxList3.Items.Count
,但是您正在使用CheckBoxList4.Items.Count
和CheckBoxList5.Items.Count
似乎CheckBoxList4
和CheckBoxList5
缺少CheckBoxList3之类的项目。
请检查您所有的CheckboxList对象以使用相同的索引器。
希望这会有所帮助。
//编辑
最佳做法:
string result = CombineCheckboxLists(checkBoxList1, checkBoxList2, checkboxlist3);
private string CombineCheckboxLists(params CheckBoxList[] list)
{
StringBuilder builder = new StringBuilder();
string result = string.Empty;
if (list?.Length > 0)
{
int minItemsCount = list.Min(l => l.Items.Count);
if (minItemsCount > 0)
{
for (int i = 0; i < minItemsCount; i++)
{
builder.Append(string.Join(",", list
.Where(l => l.Items[i].Selected)
.Select(l=> l.Items[i].Text)));
//if you want to merge all iteration via ",", please use following lines instead of above -- [marked as **]
// ** //builder.Append($"{string.Join(",", list.Select(l => l.Items[i].Value))},");
}
}
}
result = builder.ToString();
// ** // result = result.TrimEnd(',');
return result;
}
答案 1 :(得分:0)
只需如下更改您的for循环:
for (int i = 0; i < CheckBoxList3.Items.Count; i++)
if (CheckBoxList3.Items[i].Selected)
str1 += CheckBoxList3.Items[i].Text.ToString() + ",";
for (int i = 0; i < CheckBoxList4.Items.Count; i++)
if (CheckBoxList4.Items[i].Selected)
str1 += CheckBoxList4.Items[i].Text.ToString() + ",";
for (int i = 0; i < CheckBoxList5.Items.Count; i++)
if (CheckBoxList5.Items[i].Selected)
str1 += CheckBoxList5.Items[i].Text.ToString() + ",";
更新
@Caner LENGER有个好主意。但是,正如我在他的回答的评论中提到的那样,它是部分正确的,因为list.Min
返回列表的最小值,在您的情况下该列表将不起作用。为什么?
想象一下,您有3个CheckBoxList,其中每个项目都有3个项目,但其中一个项目只有4个项目。无论{CheckBoxList的第4个值是什么,都使用list.Min
,您将得到3。
所以,我更改了他的代码,这是测试结果:
public static string CombineCheckboxLists(params CheckBoxList[] list)
{
StringBuilder sb = new StringBuilder();
foreach (CheckBoxList checkBoxList in list)
{
int counter = checkBoxList.Items.Count;
for (int i = 0; i < counter; i++)
sb.Append(checkBoxList.Items[i].Selected ? checkBoxList.Items[i].Text + "," : "");
}
return sb.ToString();
}