LINQ および Devexpress グリッド データソース
-
23-08-2019 - |
質問
次のように実行時にデータソースが設定された DevExpress グリッド (DevExpress.XtraGrid.GridControl 8.2) があります。
private DataContext db = new DataContext("connection string");
gridControl.DataSource = from t in db.sometable
select new
{
Field1 = t.Name,
Field2 = t.Email,
Field3 = t.City
};
これは、設計時にデータがどのように見えるかがビューにはまったく分からないことを意味します。LINQ クエリをデータソースとして設定できるのは気に入っていますが、デザイン時にビューがどのように表示されるかを指定したいとも考えています。
- このクエリを使用することをビューに伝える方法はありますか?
- 最良の解決策は、このクエリから返されるものの内容を保持するための小さなオブジェクトを作成することでしょうか?
解決
あなたは自動的にデータソースの列を拾うためにDevExpress社のグリッドをしたい場合は、あなたのLINQクエリの戻り値の型のクラスを定義する必要があります。設計時に、Winフォームバインディングエンジンは、データ・ソースなどのソースを自動的に特性を発見するために、それを実装している場合、反射またはICustomTypeDescriptor、その種類、使用されます。 DevExpress社のグリッドは、この根本的な結合メカニズムを使用して、自動的にプロパティ情報に基づいて設計時にあなたのための列を生成しています。あなたのケースではしかし、あなたは知られているか、または設計時には使用できませんされ、あなたのLINQクエリで匿名型を作成しています。したがって、DevExressグリッドは自動的に列を生成することはできません。 @Dennisが述べたように、手動でデザイナーのグリッドに列を追加することができます。あなたは、「フィールド名」は、私は信じて、カラムのデータソースのプロパティ名と一致することを確認する必要があります。
あなたはクラスで行く場合は、、あなたはまた、データソース内のデータ変更のグリッドに認識させるためにINotifyPropertyChangedの実装をしたい場合があります。
他のヒント
IIRC では、xtragrid では、列を自動生成するためにデータソースがデータバインディング インターフェイス (つまり IBindingList(T)) を実装する必要があり、項目は INotifyPropertyChanged を実装する必要があります。
それを念頭に置いて:設計時にウィザードを使用して列を作成する場合、または実行時にコードで列を作成する場合、列の FieldName プロパティを設定している限り、その名前のプロパティを持つデータソースのデータが表示されます。
ノート:
- パブリック変数にバインドされない場合があることがわかったので、自動であろうとなかろうと、プロパティである必要があると思います。
- プロパティには何か (デフォルトまたはその他) を割り当てる必要があります。
- 項目にはパラメーターのないコンストラクターが必要です。
フィールドは設計時に既知です (Field1、Field2、Field3)。
によると 開発エクスプレス 使用できます IList
, IListSource
, ITypedList
または IBindingList
. 。それらの違いは、新しい行を追加できるかどうか、または変更によってコントロールが改良されるかどうかです。
したがって、ToList() を使用できます。
private DataContext db = new DataContext("connection string");
gridControl.DataSource = (from t in db.sometable
select new
{
Field1 = t.Name,
Field2 = t.Email,
Field3 = t.City
}).ToList();
注記:DevExpress 10.1 を使用してテストしましたが、実際に使用する場合は、 WinForms バインディング その後も次に従って動作するはずです MSDN.
私はDevExpress社のグリッドで働いていないが、私は、.NETのDataGridViewで多くのことをやった。
DevExpress社のグリッドは、自動列を生成し、.NETのDataGridViewのと同じ機能を持っていますか?
もしそうなら、それはあなたのクエリで発見され、列名としてフィールド1、フィールド2およびフィールド3(あなたの例のコードから)を使用しますどんなフィールドを表示する必要があります。
それとも列機能を自動生成をオフにして、デザイン時に列を追加します。限り、彼らはあなたのクエリは、それが正常に動作する必要があります返すものと一致してます。