【问题标题】:C#: Pushing changes from DataGridView to BindingList back to database?C#:将更改从 DataGridView 推送到 BindingList 回数据库?
【发布时间】:2011-06-06 21:10:47
【问题描述】:

我正在使用 BindingList 在 Windows 窗体应用程序的 DataGridView 中显示 Person 对象列表。对 DataGridView 的更改会更改基础 BindingList。我已经完成了这部分工作。

现在我希望将列表保存到数据库表中。从数据库中读取列表并填充人员列表很简单,但是如果我从 DataGridView 添加/编辑/删除一个人,我如何以及何时将该更改持久化回数据库?

(其次,这种方法是否可行,还是我错过了一些更大的图景?我不想使用数据表,因为我想以抽象的面向对象的方式处理我的代码。)

【问题讨论】:

    标签: database winforms datagridview bindingsource bindinglist


    【解决方案1】:

    为了在 Windows 窗体中轻松持久化对象,您可以使用 LINQ2SQL,它完全符合您的要求,并且当您想从数据库中收集对象时,它还会具体化对象。

    快速示例,在为支持的数据库(即 SQL Server (Express))从数据库架构创建 linq 上下文后,您只需在表单中创建它的实例,并在对数据进行单原子操作时使用它 - 读取、编辑,写或取消。

      private YourAppContext context;
    
      private void RenewContext()
      {
         context = new YourAppContext();
      }
    
      private void LoadData()
      {
        RenewContext();
        DataGridView1.DataSource = context.Articles.OrderByDescending(x => x.DatePosted).Take(10);
      }
    
      private void AcceptButtonPressed()
      {
        context.SubmitChanges();
      }
    
      private void CancelButtonPressed()
      {
        LoadData();
      }
    

    显然您可以通过 BindingSource 传递数据。

    【讨论】:

    • 有趣的是,我以前在 ASP.NET 中使用过 Linq2Sql,但在这里使用完全让我无法理解。感谢您指出了这一点!这可能是我决定走的路,尽管我仍然很好奇如何在不使用 linq2sql 的情况下做到这一点。
    • 那么您可能应该自己为您的对象实现 INotifyPropertyChanged,跟踪更改的属性(并维护新的和已删除的对象列表)并反转收集数据的逻辑以便能够调用 INSERT, UPDATE 和 DELETE 语句根据您的更改。在其中一些任务中,反射和归因可能有用,因此您将能够存储对象而无需自己编写查询,而是自动生成查询。然而,你为什么要重新实现轮子?
    • 好点。我刚刚发现的一个实际原因是,由于我使用的是 Visual Studio 2010 express,我认为 Linq to SQL 设计器不支持 sql server 数据库。
    猜你喜欢
    • 2011-05-02
    • 2021-11-04
    • 1970-01-01
    • 2021-09-15
    • 2012-07-07
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多