0

EntityInstantFeedbackSourceコントロールへのデータソースとしてDevExpressを使用しています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();
}

グリッドは空白です。ただし、「query」の周りにforeachループを記述して出力を表示するとConsole.WriteLine、データを表示できます。
また、設定e.QueryableSource = q.ToArray().AsQueryable()すると、グリッドにデータが表示されます。ただし、これを行うと、の利点が無効になるため、一度にすべてのデータが読み込まれますEntityInstantFeedbackSource

クエリにデータがないのはなぜですか?そして、ObjectSetをグリッドコントロールにデータバインドする方法は?

4

1 に答える 1

1

この問題の理由は、ハンドラーだけで処理するのではなく、ハンドラーでObjectContext直接処理しているためだと思います。さらに、結果のオブジェクトセットを直接に渡すことができます。 したがって、正しいコードは次のようになります。GetQueryableDismissQueryablee.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();
}
于 2013-03-07T07:57:22.730 に答える