【问题标题】:Data binding linq query to datagridView in Entity Framework 5.0在 Entity Framework 5.0 中数据绑定 linq 查询到 datagridView
【发布时间】:2012-09-19 19:02:00
【问题描述】:

我正在学习实体框架(5.0 和 VSExpress 2012),但在将查询绑定到 WinForms 中的 dataGridView 时遇到了问题。 我有下面的代码,当我启动应用程序时它显示我的查询正常,但我不知道在更改底层数据库中的数据后我需要做什么来更新 dataGridView。这样做的最佳方法是什么?我在这里做错了什么?

private void Form1_Load(object sender, EventArgs e)
    {
        using( var ctx = new TimeKeepEntities())
        {

            var qLoggedIn = from r in ctx.tblTimeRecords
                        where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30
                        select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut };

            dataGridView1.DataSource = qLoggedIn.ToList();

        }
    }

【问题讨论】:

    标签: c# entity-framework entity-framework-5


    【解决方案1】:

    Pho 请注意,他们使用的是 winforms 而不是 asp.net。根据 MSDN,您可以执行以下操作:

    BindingSource bindingSource1 = new BindingSource();
    bindingSource1.DataSource = (from r in ctx.tblTimeRecords
                            where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30
                            select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut }).ToList();
    
    dataGridView1.DataSource = bindingSource1;
    

    见:msdn documentation

    【讨论】:

    • 我这样做了。绑定是正确的,当使用带有 context.SaveChanges() 的保存按钮时,我能够从 datagridview 编辑数据。问题是当我必须添加新的数据行或删除它时。 SaveChanges 时,这些更改不会反映在数据库中。也许我忘记了一些属性集...?¿
    • 我遇到了同样的问题@AlejandrodelRío。现在我要搜索你所有的问题和答案,看看你是否解决了它。祝我好运!
    • @Robino 我没有回答这个问题,但是这种方法不会帮助您直接从 datagridview 添加或删除对象。相反,您必须创建一个 BindingList,其中 ObjectToShowInDatagrid 是一个具有您要显示的属性的对象,并且它具有数据库实体的一个实例。您还必须将 notifyPropertyCHanged 方法添加到所有“集合”中。这样,更改将反映到对象和数据库。我将在答案中进一步解释。
    【解决方案2】:

    你必须用dataGridView1.DataBind();绑定数据:

    ...
    dataGridView1.DataSource = qLoggedIn.ToList();
    dataGridView1.DataBind();
    ...
    

    【讨论】:

    • 我没有在我的智能感知中看到 .DataBind() 方法。我正在使用 Entity Framework 5,也许他们将其更改为其他内容。
    • 我不太确定为什么您在编辑器中看不到它,但我知道它必须在分配数据源后绑定:)
    • 问题是,这更像是 GridView 控件本身的 .NET 方法,与实体框架无关。
    • 如果仍然没有运气,可能是 GridView 不期望分配给 GridView 的数据(您必须将 GridView 设置为 AutoGenerateColumns 或在网格上预先分配数据绑定列然后将数据绑定到它 - 列与对象属性匹配)。看看这个:github.com/pauloosthuysen/int/blob/master/Int/Home.aspx.cs & github.com/pauloosthuysen/int/blob/master/Int/Home.aspx
    • .DataBind 在带有 DataGridView 的 Winforms 中不需要,与使用 WebForms GridView 的方式相同。
    【解决方案3】:

    .Net 使用断开连接的模型。当您从数据库中获取信息时,它是该时间点的快照。如果您更改底层数据存储中的数据,除非您明确地重新查询数据库并重新绑定您的 UI,否则这些更改不会反映。

    当您在 UI 中保存更改时,EF 可以检查是否有其他人更改了您正在修改的行(出于并发问题)并让您知道是否存在潜在冲突。

    【讨论】:

    • 有趣。你能发布一些例子吗?会很有用的。
    • 如何鼓励 EF 进行这项检查?
    【解决方案4】:
     IEnumerable<DataRow> query =( from p in orginalList.AsEnumerable()
                                        where p.Field<long>("Category") == 2
                                        select p).ToList();
                            DataTable boundTable = query.CopyToDataTable<DataRow>();
    
                            dataGridView1.AutoGenerateColumns = false;
    
                            dataGridView1.DataSource = boundTable;
    

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 2012-07-24
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多