ORM, привязка данных к DataGridView: вставка / удаление новых строк, не сохраненных в базе данных - PullRequest
3 голосов
/ 02 января 2011

Я довольно новичок в ORM, и в настоящее время я пробую Telerik OpenAccess ORM, но вопрос, возможно, на самом деле не относится к этому ORM, и я все еще не полностью остановился на этом ORM.

Я пытаюсь добиться привязки объекта DataGridView, чтобы показать коллекцию объектов Customers, показывающую всех клиентов в таблице customer.

Я связал его с BindingSource и связал BindingSourceв элемент управления DataGridView.

Я могу успешно изменить существующие элементы (используя метод SaveChanges для OpenAccess ORM).Когда я сохраняю, содержимое сохраняется обратно в базу данных, как я и ожидал.

Однако, если я удаляю строку из DataGridView или добавляю новые, они не сохраняются в базе данных без сообщения об ошибке илиисключение вообще.

В идеале я хотел бы иметь возможность выполнять все операции CRUD, возможные с ORM, точно так же, как я мог бы делать это с типичной таблицей DataTable ...

Код, выполняющий привязку, выглядит следующим образом:

        List<Customer> ukCustomers = (from c in diagrams.Customer
                              where c.Country == "UK"
                              select c).ToList();

        customersBindingSource.DataSource = ukCustomers;
        customersBindingSource.AllowNew = true;

В настоящее время я предполагаю, что новые строки, добавленные пользователем в DataGridView, не являются частью списка, а являются "автономными" экземплярами Customer?Я бы подумал, что они будут автоматически добавлены в список.То же самое касается удаленных строк, которые, как я думал, будут автоматически удалены из списка, и что метод SaveChanges из ORM сможет подобрать это?

Должен ли я делать что-то большее, чем просто связывание?У кого-нибудь был такой успех, и в целом, насколько успешным был ваш опыт связывания данных с WinForms, с вашим ORM (не обязательно Telerik)?

Спасибо.

1 Ответ

3 голосов
/ 07 января 2011

Ваше подозрение верно.Вы привязываете сетку к «автономному» списку объектов, и пока каждый объект самопровозглашается, этот список отсутствует.Вот почему изменения в существующих объектах работают должным образом, а добавления / удаления - нет.

Одним из решений является использование наблюдаемой коллекции вместо стандартного списка.Затем вы можете обрабатывать привязку так же, но реагировать на события добавления / удаления, добавляя / удаляя элементы из контекста по мере необходимости.

Базовый пример:

  private PropertyManagerModel.DemoDBEntityDiagrams context;
    public Form1()
    {
        InitializeComponent();
        context = new DemoDBEntityDiagrams();
        LoadCommunities();
    }

   private void LoadCommunities()
    {         
        var communityList = new ObservableCollection<Community>(context.Communities);
        communityList.CollectionChanged += new NotifyCollectionChangedEventHandler(communityList_CollectionChanged);
        this.dataGridView1.DataSource = new BindingSource() { DataSource=communityList};
    }

    void communityList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            context.Add(e.NewItems);

        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
            context.Delete(e.OldItems);

        context.SaveChanges();
    }      

Насколько я знаю, это будет иметь место для всех ORMS.Надеюсь, это поможет!

С уважением,

Джошуа Холт

...