需要帮助将多个复选框列表中的数据插入数据库

时间:2019-10-21 02:21:09

标签: c# asp.net checkboxlist

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>

2 个答案:

答案 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.CountCheckBoxList5.Items.Count

似乎CheckBoxList4CheckBoxList5缺少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();
}