Хорошо, я не знаю, в чем ваша проблема, но у меня есть несколько идей.
Во-первых, существует вероятность того, что по некоторым причинам при добавлении строк некоторые из них отсутствуют. Из кода, который вы дали, я не вижу ничего плохого в коде, похоже, вы правильно добавляете в список на основе значения флажка. Чтобы убедиться, что это не проблема, поставьте точку останова в операторе if if (addRows.Count > 0)
и проверьте значение переменной 'addRows', чтобы убедиться, что все ожидаемые строки находятся там. Если вы не уверены, как это сделать, отладка Google в Visual Studio (или любой IDE, которую вы используете).
Во-вторых, есть проблема с этим objConnect.UpdateDatabase(addRows.ToArray());
Я не узнаю этого код, и не уверен, что он делает. Это часть EF C? Используете ли вы пользовательскую библиотеку для обновления базы данных? Вероятно, в этом и заключается проблема. Исходя из предоставленного вами кода, я не уверен в структуре базы данных, как она обновляется и какие технологии вы используете для этого. Может быть, предоставить настройки для базы данных в вашем вопросе? Но похоже, что проблема может возникнуть.
У меня также есть несколько дополнительных отзывов, есть некоторые проблемы с вашим кодом в целом, о которых я вам так советую, но давайте разберемся с ним по частям.
Во-первых, вместо:
private void checkboxheader_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells["chk"].Value) == false)
{
row.Cells["chk"].Value = true;
}
else
{
row.Cells["chk"].Value = false;
}
}
}
Сделайте это:
private void checkboxheader_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Cells["chk"].Value = !Convert.ToBoolean(row.Cells["chk"].Value) ;
}
}
Это улучшает читабельность вашего кода, в основном это говорит: «Установите значение этой ячейки в противоположность тому, что было», без потребность в большом операторе if.
Затем в первом блоке foreach измените:
if (Convert.ToBoolean(row.Cells["chk"].Value) == true)
на
if (Convert.ToBoolean(row.Cells["chk"].Value))
Тот же принцип. Если операторы будут выполнять код на основе логического значения. Например,
true == true - это true.
false == true - это false.
Дело в том, что нет необходимости сравнивать ваше значение с true, как, например, когда это правда, это будет правдой независимо, и когда это ложно, это будет ложью независимо от. Изучите булеву алгебру, чтобы узнать больше.
Объедините следующие два ifs.
if (addRows.Count > 0)
{
if ((addRows != null))
{
Примерно так:
if (addRows != null && addRows.Count > 0)
Примечание: всегда проверяйте нулевое значение в переменной прежде чем использовать его, если вы не рискуете исключение нулевой ссылки. Делает ли ваша программа sh, если вы пытаетесь выполнить обновление, ничего не выбрав? здесь ваша итерация по каждой строке. Теперь я думаю, что вы пытаетесь обновить каждую отдельную строку по одной, но затем вы вызываете
objConnect.UpdateDatabase (addRows.ToArray ())
Передается массив, состоящий из нескольких строк. Таким образом, вы обновляете полный набор или ряды, а не каждый отдельный ряд. Таким образом, нет необходимости проводить l oop через каждый ряд. Чтобы исправить этот код, измените его на:
try
{
objConnect.UpdateDatabase(addRows.ToArray());
Po = 1;
}
catch (Exception err)
{
MessageBox.Show(err.Message,
"Information",
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
}
Так что удалите для l oop.
Вы можете сделать даже больше, но это неплохое начало.