2013-03-06 34 views
0

我正在使用DevExpress EntityInstantFeedbackSource作爲數據源到XtraGrid控件。但是,我沒有使用app.config文件中的連接字符串;而是我在運行時設置實體框架的連接字符串。
的代碼如下:databind entityframework ObjectSet <T> to gridcontrol(c#)

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數據綁定到一個gridcontrol?

+0

然而如果設置了e.QueryableSource = q.ToArray()AsQueryable已(),然後我可以在網格中看到的數據。但是這樣做會一次加載所有數據,從而使entityinstantfeedbacksource的好處無效。 – user1746821 2013-03-06 10:03:18

回答

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(); 
} 
+0

你是對的。謝謝指出 – user1746821 2013-03-07 08:18:19

+0

但是有一個小問題。如果我替換VistDB的SQL Server並嘗試按網格中的任何列進行分組,我會得到不一致的結果。分組對SQL SERVER來說很好。也可以用XPInstantFeedbackSource代替entityInstantFeedbackSource – user1746821 2013-03-07 10:57:48

+0

我相信[DevExpress支持](http://www.devexpress.com/Support/Center/)的人都知道答案... – DmitryG 2013-03-07 12:00:29