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

Need help for insert data from multiple check-box-list into database

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>

Wrong line 1: for (int i = 0; i < CheckBoxList3.Items.Count + 1; i++

Wrong line 2: CheckBoxList3.Items[i].Selected || CheckBoxList4.Items[i].Selected || CheckBoxList5.Items[i].Selected

Wrong line 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;
    }

只需像下面这样更改您的 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 returns 列表的最小值在你的情况下是行不通的。为什么?

假设你有 3 个 CheckBoxList,每个 CheckBoxList 有 3 个项目,除了其中一个有 4 个项目。使用 list.Min 你会得到 3,无论 CheckBoxList 的第 4 个值是什么。

所以,我更改了他的代码,这是测试结果:

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();
}