Фиксация изменений после редактирования DataGridView с использованием LINQ2SQL (Winforms) - PullRequest
1 голос
/ 26 октября 2009

Учитывая DataGridView, у которого установлен BindingSource следующим образом:

В winform мы добавляем объект BindingSource, используя конструктор, который называется myBindingScource. Затем в Form.Designer.cs мы добавляем это в InitializeComponents ()

myBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram

Позже, в самой форме мы делаем:

myDataView.DataSource = myBindingSource;

и тогда у нас есть метод, который заполняет Grid ...

using ( myDataContext mdc = new MyDataContext() )
{
    myDataView.DataSource = from per in mdc.person
                            select per;
}

В качестве примечания я настроил столбцы в Design Time, и все показывает нормально. Поскольку LINQ 2 SQL не возвращает Anonymous, «myDataView» является редактируемым, и здесь возникает вопрос…

Вопрос: как мне сохранить эти изменения?

В сетке данных есть десятки событий, и я не уверен, какое из них более подходящее. Даже если я попробую одно из событий, я все еще не знаю, какой код мне нужно выполнить, чтобы отправить эти изменения обратно в БД, чтобы сохранить изменения.

Я помню, что в те дни ADO.NET DataSet вы делали dataadapter.Update (набор данных);

Также представьте, что функции retrieve и persist () находятся на бизнес-уровне, а сигнатура метода выглядит следующим образом:

public void LoadMyDataGrid(DataGridView grid);

этот метод берет сетку формы и заполняет ее с помощью запроса LINQ2SQL, показанного выше.

Теперь я хотел бы создать такой метод:

public void SaveMyDataGrid(DataGridView grid); // or similar

Идея состоит в том, что этот метод не относится к одному и тому же классу (форме), во многих примерах предполагается, что все вместе.

Ответы [ 2 ]

3 голосов
/ 26 октября 2009

Событие RowValidated было бы хорошим местом, чтобы проверить, настало ли время для сохранения изменений в базе данных.

    this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowValidated);

    private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        MyLinq.Person person = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyLinq.Person;

        if (person != null)
        {
            // save this person back to data access layer
        }
    }

После редактирования:

Я бы не передавал экземпляр сетки данных на уровень обслуживания. Я бы передал обратно IEnumerable<MyLinq.Person> или IList<MyLinq.Person>, затем перебрал бы коллекцию на вашем сервисном уровне и в зависимости от выполненной логики; сохранить изменения в слое доступа к данным (вашей базе данных)

1 голос
/ 26 октября 2009

Метод 'save' для объекта DataContext: SubmitChanges().

using (MyContext c = new MyContext())
{
     var q = (from p in c.People
             where p.Id == 1
             select p).First();
     q.FirstName = "Mark";
     c.SubmitChanges();
}

Как упоминал Майкл Г., вам нужно собрать изменения и передать их обратно объекту bll.

...