Программное обновление значения ячейки Datagridview сохраняет только часть изменений в базе данных.

я работаю над приложением Windows Forms, которое позволяет пользователю программно обновлять базу данных (обновлять количество значений ячеек один раз) и вручную (обновлять одно за другим). процесс нормально работает в ручном обновлении, но при попытке обновления программно сохраняются только некоторые изменения.

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

Что странно, так это то, что когда я щелкаю заголовок столбца, чтобы отсортировать значения, прежде чем закрыть его (значения - это даты), некоторые даты не в порядке. те же даты не сохраняются в базе данных.

Как это исправить? Как сделать, чтобы все изменения сохранялись?

Вот мой связанный код:

private void save_btn_Click(object sender, EventArgs e)
{
     dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
     string t = "";
     Label l;
     int space;
     for (int c = 1; c < tableLayoutPanel1.ColumnCount; c++)
     {
         for (int r = 1; r < tableLayoutPanel1.RowCount; r++)
         {
             l = (Label)tableLayoutPanel1.GetControlFromPosition(c, r);
             if (l != null)
             {
                 t = l.Text;
                 for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                 {
                    if (dataGridView1[2, i].Value.ToString().Equals(t))
                    {
                        dataGridView1[4, i].Value = GetDate();
                    }
                 }
             }            
         }           
     }
     bindingSource1.EndEdit();
     dataAdapter.Update((DataTable)bindingSource1.DataSource);
     dataGridView1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
}

Изменить: код обновления вручную:

  private void saveDB_Btn_Click(object sender, EventArgs e)
        {
            try
            {
                bindingSource1.EndEdit();
                dataAdapter.Update((DataTable)bindingSource1.DataSource);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

Привязка Datagridview к коду базы данных:

 void GetData(string selectCommand)
        {
            try
            {
                dataAdapter = new SqlCeDataAdapter(selectCommand, conn);
                commandBuilder = new SqlCeCommandBuilder(dataAdapter);
                table = new DataTable();
                dataAdapter.Fill(table);
                bindingSource1.DataSource = table;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

person someGuy    schedule 29.11.2014    source источник
comment
Вы используете BindingSource, возможно, несохраненные значения не привязаны к нему?   -  person Omer    schedule 03.12.2014
comment
Спасибо за комментарий. Какая причина может привести к тому, что эти значения не будут связаны? и почему иногда работает, а иногда нет?   -  person someGuy    schedule 03.12.2014
comment
Если вы спросите, почему при «ручном» обновлении это работает, и почему не работает, когда вы пытаетесь перечислить все ячейки и сохранить данные «автоматически», ответ будет, что это не тот же самый код. Вы разместили только «автоматический» код сохранения, так что довольно сложно угадать.   -  person Omer    schedule 03.12.2014
comment
Ручная часть на самом деле представляет собой последние 3 строки кода без части EditMode.   -  person someGuy    schedule 03.12.2014
comment
Верно. По-прежнему довольно сложно помочь вам, имея в руках только часть кода. Я предлагаю вам либо опубликовать полный код формы в pastebin и добавить ссылку на свой вопрос, либо попытаться уменьшить проблему и минимизировать свой код, удалив все несвязанное (например, вещи, которые сохраняются), чтобы вы могли опубликовать наименьший возможный воспроизводимый пример, демонстрирующий вашу проблему. Это значительно упростит вам помощь (и вы, возможно, даже сами разберетесь с этим по пути!)   -  person Omer    schedule 03.12.2014
comment
Пожалуйста, проверьте мое новое редактирование вопроса. Я добавил немного кода, чтобы вы могли посмотреть. @Омер   -  person someGuy    schedule 04.12.2014


Ответы (1)


Несмотря на дополнительный код, который вы добавили после редактирования, трудно точно сказать, что происходит, потому что некоторый соответствующий код все еще отсутствует, например, метод GetDate(), код для Sorting и код TableLayoutPanel в *.Designer. CS-файл.

Было бы довольно легко найти основную причину во время сеанса отладки; во-первых, проверьте, не пропустили ли вы значения, которые не хранятся в элементе управления Label, если они есть. Это можно сделать, добавив пустое предложение else в первое выражение if и поставив там точку останова, чтобы посмотреть, сработает ли оно.

Точка останова внутри оператора first if может сообщить вам, видите ли вы там все значения, которые отображаются в пользовательском интерфейсе. Просто поставьте точку останова внутри if и проверьте Label.Text.

И последнее, но не менее важное: вы можете изучить второй оператор if. Поскольку вы сравниваете текст метки TableLayoutPanel с текстом DGV, может возникнуть несоответствие, из-за которого некоторые значения не будут обновляться. Это можно сделать, пройдясь по коду в самом внутреннем предложении и убедившись, что все метки, которые должны сопоставляться, действительно совпадают.

Надеюсь это поможет.

person Omer    schedule 04.12.2014