Member 12349597 Ответов: 3

Если условие пропускается


У меня есть цикл foreach для winforms datagridview, который размещен внутри wpf usercontrol. Цикл foreach пропускает первое условие автоматически объявляет его нулевым, а затем выполняется правильно для каждой последующей строки. Условие if истинно.

foreach (DataGridViewRow item in Dashboard_dataGrid.Rows)
    {


        //--[0] is the index of the checkbox Column on the Datagridview
        if (Convert.ToBoolean(item.Cells[0].Value) == true) //if switched to false it works or add true) continue;
        {
            MessageBox.Show("Selected Rows :" + item.Cells[0].RowIndex.ToString()); //just to show where I am at in the index
            sqlCon.Open();

            SqlDataAdapter abc = new SqlDataAdapter("Delete from tbl_ClientProducts Where productID = '" + item.Cells[11].Value.ToString() + "' and  userID = '" + UtilityClass.userID + "'", sqlCon);

            DataTable dtbl = new DataTable();
            abc.Fill(dtbl);
            Dashboard_dataGrid.Update(); //did not work
            Dashboard_dataGrid.Refresh(); // did not work
            sqlCon.Close();
        }

    }
    MessageBox.Show("Your product(s) have been deleted Successfully");


}

Что я уже пробовал:

Я изменил условие на false, которое он оценивает, говоря, что есть нулевое значение, но оно не равно нулю .Сеть установила ячейку в ноль

if (Convert.ToBoolean(item.Cells[0].Value) == false)

Richard Deeming

"Delete from tbl_ClientProducts Where productID = '" + item.Cells[11].Value.ToString() + "' and userID = '" + UtilityClass.userID + "'"

Не делай этого так!

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

SqlDataAdapter abc = new SqlDataAdapter("Delete from tbl_ClientProducts Where productID = @productID and userID = @userID", sqlCon);
abc.SelectCommand.Parameters.Add("@productID", item.Cells[11].Value);
abc.SelectCommand.Parameters.Add("@userID, UtilityClass.userID);

Member 12349597

Sql-инъекция будет рассмотрена позже, это просто для того, чтобы заставить ее работать так, как я хочу, прежде чем перейти к фазе безопасности приложения. Итак, теперь идея о состоянии if?

Maciej Los

Вы должны разработать приложение, обращая внимание на безопасность. Вы не можете "улучшить" приложение позже (как вы заявили в разделе "фаза безопасности)", по многим причинам.

Member 12349597

Ваш убивает меня малявка вопрос если условие пропускается. Ваша теория приложений безопасности была рассмотрена. Есть ли у вас какая-либо информация, которая может быть полезна для пропущенного условия if?.. Если нет, то спасибо, но в данный момент я не имею дела с безопасностью.

F-ES Sitecore

Я действительно не понимаю этого вопроса, но проблема, вероятно, заключается в том, что вы пытаетесь изменить источник данных чего-то во время итерации. Возможно, проблема заключается в том, что foreach повторяет старые данные, и вы ожидаете, что он будет повторять обновленные данные.

Member 12349597

Я не думаю, что это так, потому что он правильно работает для строк добавления, так что, например, если у меня есть 5 строк, цикл foreach будет работать для 4 и пропускать последнюю строку. Если у меня есть только одна строка, она пропустит строку, и ничего не произойдет. Но я посмотрю, может ли быть что - то в этом роде для этого одного ряда. Спасибо

3 Ответов

Рейтинг:
1

Maciej Los

Предположим, что столбец datagridview[0] содержит элемент управления checkbox... вы должны читать DataGridViewCheckBoxCell.Значение ИСТИНА значение[^] или DataGridViewCheckBoxCell.FalseValue[^]

foreach (DataGridViewRow item in Dashboard_dataGrid.Rows)
    {
        DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)item.Cells[0]; //--[0] is the index of the checkbox Column on the Datagridview
        if (chk.TrueValue) 
        {
           //your logic here...
        }
    }


Примечание: иногда необходимо проверить, есть ли значение checkbox null.


Member 12349597

Спасибо, но это тоже не сработало. После дальнейших исследований я считаю, что это проблема метаданных. Похоже, что в данном конкретном случае индекс равен 0, а начальная строка начинается с 1, но это не похоже на то, что я могу изменить в данный момент. В настоящее время обходной путь состоит в том, чтобы оценить каждую строку, а не перебирать их. Я очень ценю ваш ответ.

Рейтинг:
0

#realJSOP

0) Как уже отмечалось, не делайте этого таким образом.

1) Почему, черт возьми, вы используете элемент управления Winforms в WPF? Просто потому, что это "можно сделать", не означает, что это должно быть сделано.

2) используйте шаблон MVVM и выполните соответствующие привязки. Вы должны иметь возможность переместить цикл foreach в свою наблюдаемую коллекцию, тем самым абстрагируя его из пользовательского интерфейса. Вся эта штука с MVVM слишком велика, чтобы вписаться в ответ здесь, потому что существует так много вариаций относительно ее реализации, но наверняка в форме не должно быть кода foreach.


Member 12349597

MVVM, на мой взгляд, заключается в том, чтобы абстрагироваться, а разделение проблем делает код действительно раздутым. Кроме того, если все, что вам нужно, - это datagridview, подключенный к избыточному источнику данных, зачем вам разбивать код на 3-4 раздела для такой общей задачи? Документация MVVM относительно флажка datagrid очень плоха, плюс она отлично работает, за исключением этого условия if..... Кто-нибудь еще думает, что у них есть причина

#realJSOP

Вы не раздуваете код с помощью MVVM - вы просто перемещаете код, который вам все равно придется написать, в более логичное место.

Рейтинг:
0

AntGamble

Привет,

foreach также вычисляет "новую строку", если сетка позволяет пользователю добавлять строки.

Проверьте, что в строке.IsNewRow - это ложь.


Member 12349597

Спасибо, пользователь не может добавлять новые строки.