Нужна помощь для вставки данных из нескольких списков флажков в базу данных - PullRequest
0 голосов
/ 21 октября 2019
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() + ",";

Я получаю сообщение об ошибке «Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс». Как решить эту проблему?

То, что я хочу сделать, это собрать данные из флажка в нескольких списках флажков и объединить их вместе и сохранить в базе данных.

Любое предложение или помощь будетбыть великимСпасибо

ОБНОВЛЕНИЕ: Это один из моих списков флажков. Ошибка указывает на мою вторую строку цикла 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 ]

1 голос
/ 21 октября 2019

Неверная линия 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;
    }
0 голосов
/ 21 октября 2019

Просто измените цикл 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. Используя list.Min, вы получите 3, независимо от того, что находится внутри 4-го значения CheckBoxList.

Итак, я изменил его код и вот результат теста:

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