数据库
首页 > 数据库> > CodeGo.net> ORM,数据绑定到DataGridView:插入/删除未保存到数据库的新行

CodeGo.net> ORM,数据绑定到DataGridView:插入/删除未保存到数据库的新行

作者:互联网

我对ORM相当陌生,目前正在尝试Telerik OpenAccess ORM,但问题实际上可能并非特定于该ORM,而且无论如何我仍未完全解决该ORM.

我想要实现的是绑定一个DataGridView来显示“客户”对象的集合,这些对象显示了“客户”表中的所有客户.

我已将其绑定到BindingSource并将BindingSource绑定到DataGridView控件.

我可以成功修改现有项(使用OpenAccess ORM的SaveChanges方法).保存后,内容将按预期保存回数据库中.

但是,如果我从DataGridView中删除一行或添加新行,则它们不会保存到数据库中,不会有任何错误消息或异常.

理想情况下,我希望能够使用ORM执行所有可能的CRUD操作,就像我能够使用典型的DataTable来执行此操作一样…

执行绑定的代码如下所示:

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

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

我目前的猜测是,用户添加到DataGridView的新行不是列表的一部分,而是“独立”客户实例?我以为它们会自动添加到列表中.删除的行也一样,我以为会自动从列表中删除,并且ORM中的SaveChanges方法能够实现这一点?

我是否应该做的不仅仅是绑定?
有没有人在此方面取得任何成功,总的来说,使用您选择的ORM(不一定是Telerik的)在WinForms上进行数据绑定的经验有多成功?

谢谢.

解决方法:

您怀疑是正确的.您将网格绑定到“独立”对象列表,并且每个对象都是自跟踪的,但列表不是.这就是为什么对现有对象所做的更改可以按预期工作,但添加/删除却不能按预期进行的原因.

一种解决方案是使用可观察的集合而不是标准列表.然后,您可以同样地处理绑定,但是需要根据需要通过从上下文中添加/删除项目来响应添加/删除事件.

基本示例:

  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都是如此.希望这可以帮助!

问候,

约书亚·霍尔特(Joshua Holt)

标签:data-binding,datagridview,telerik,c,winforms
来源: https://codeday.me/bug/20191208/2094596.html