【问题标题】:databind entityframework ObjectSet<T> to a gridcontrol (c#)将实体框架 ObjectSet<T> 数据绑定到网格控件(c#)
【发布时间】:2013-03-07 16:01:42
【问题描述】:

我使用 DevExpress EntityInstantFeedbackSource 作为 XtraGrid 控件的数据源。但是我没有使用app.config 文件中的连接字符串;而是我在运行时为实体框架设置连接字符串。
代码如下:

void Form1_Load(object sender, EventArgs e)
{
    entityInstantFeedbackSource1.KeyExpression = "Prodid";
    entityInstantFeedbackSource1.GetQueryable += entityInstantFeedbackSource1_GetQueryable;
    entityInstantFeedbackSource1.DismissQueryable += entityInstantFeedbackSource1_DismissQueryable;
    gridControl1.DataSource = null;
    gridControl1.DataSource = entityInstantFeedbackSource1;
}
void entityInstantFeedbackSource1_GetQueryable(object sender, GetQueryableEventArgs e)
{
    EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
    ecsb.Metadata = @"res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl";
    ecsb.Provider = @"System.Data.SqlClient";
    ecsb.ProviderConnectionString = @"data source=.\sqlexpress;initial catalog=AdventureWorks;  integrated security=True;MultipleActiveResultSets=True;App=EntityFramework";
    using (var context = new ObjectContext(ecsb.ConnectionString))
    {
        context.DefaultContainerName = "AdventureWorksEntities";
        ObjectSet<Person> query = context.CreateObjectSet<Person>();
        var q = from s in query
               select s;
        e.QueryableSource = q;
        e.Tag = context;
    }
}

void entityInstantFeedbackSource1_DismissQueryable(object sender, GetQueryableEventArgs   e)
{
    ((ObjectContext)e.Tag).Dispose();
}

网格是空白的。但是,如果我围绕“查询”编写一个 foreach 循环并在Console.WriteLine 中查看输出,那么我可以看到数据。
此外,如果我设置e.QueryableSource = q.ToArray().AsQueryable(),那么我可以在网格中看到数据。但是这样做会取消EntityInstantFeedbackSource 的好处,从而一次性加载所有数据。

为什么查询中没有数据?以及如何将 ObjectSet 数据绑定到网格控件?

【问题讨论】:

  • 但是,如果我设置 e.QueryableSource=q.ToArray().AsQueryable() 那么我可以在网格中看到数据。但是这样做会一次性加载所有数据,从而抵消了 entityinstantfeedbacksource 的好处。

标签: c# winforms entity-framework-4 devexpress xtragrid


【解决方案1】:

我相信这个问题的原因是您直接在 GetQueryable 处理程序中处理 ObjectContext 而不是仅在 DismissQueryable 中进行处理。此外,您可以将结果对象集直接传递给e.QuerableSource
因此正确的代码应该是这样的:

void entityInstantFeedbackSource_GetQueryable(object sender, DevExpress.Data.Linq.GetQueryableEventArgs e) {
    //... connection initialization ...
    var context = new ObjectContext(ecsb.ConnectionString);
    ObjectSet<Person> personSet = context.CreateObjectSet<Person>();
    e.QueryableSource = personSet;
    e.Tag = context;
}
void entityInstantFeedbackSource_DismissQueryable(object sender, DevExpress.Data.Linq.GetQueryableEventArgs e) {
    ((ObjectContext)e.Tag).Dispose();
}

【讨论】:

  • 但是有一个小问题。如果我为 VitDB 替换 SQL Server 并尝试按网格中的任何列进行分组,我会得到不一致的结果。分组对于 SQL SERVER 来说很好。 XPInstantFeedbackSource 而不是 entityInstantFeedbackSource 也可以
  • 相信DevExpress Support的人都知道答案了……
  • 是的,你是对的。如果我不使用任何即时反馈源并将网格直接数据绑定到实体,那么分组就不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2012-01-07
  • 2023-03-25
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多