2009-05-19 66 views
0

我有一个网格的DevExpress(DevExpress.XtraGrid.GridControl 8.2)与在运行时设置像这样一个数据源:LINQ和DevExpress的网格数据源

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查询设置为数据源,但我也想指定在设计时视图的样子。

  • 有没有一种方法可以告诉视图它将使用此查询?
  • 最好的解决方案是创建一个小对象来保存 这个查询返回的内容 ?

回答

2

如果您希望DevExpress网格自动选取数据源的列,您将必须为LINQ查询的返回类型定义一个类。在设计时,如果源实现自动发现数据源的属性及其类型等,则WinForm绑定引擎使用反射或ICustomTypeDescriptor。 DevExpress网格正在使用此基础绑定机制,并根据属性信息在设计时自动为您生成列。然而,在你的情况下,你正在LINQ查询中创建一个匿名类型,这在设计时是未知的或不可用的。因此,DevExress Grid不能自动生成列。正如@丹尼斯提到的,您可以在设计器中手动添加列到网格中。您需要确保列上的'FieldName'与我的数据源上的属性名称匹配。

如果您使用类,您可能还需要实现INotifyPropertyChanged以使网格知道数据源中的数据更改。

0

我还没有与DevExpress网格一起工作,但我已经使用.NET DataGridView做了很多工作。

DevExpress网格是否具有与自动生成列的.NET DataGridView相同的功能?

如果是这样,那么它应该显示在您的查询中找到的任何字段,并将Field1,Field2和Field3(来自示例代码)作为列名。

或者只是关闭自动生成列功能并在设计时添加列。只要它们与你的查询返回的内容匹配,它应该可以正常工作。

1

IIRC,xtragrid要求数据源实现一个数据绑定接口(即IBindingList(T))以便自动生成列,并且这些项目应实现INotifyPropertyChanged。

考虑到这一点:如果在设计时或在运行时通过向导创建列,只要设置了列的FieldName属性,它们就会显示数据源中的数据,其属性为那个名字。

注:

  • 我认为它必须是一个属性,自动与否,我发现它有时会不绑定到公共变量。
  • 该属性必须分配一些东西(默认或其他)。
  • 该项目必须有一个无参数的构造函数。
1

该字段在设计时已知(Field1,Field2,Field3)。

根据DevExpress,您可以使用IList,IListSource,ITypedListIBindingList。它们之间的区别在于您是否可以添加新行或者是否改变了控件。

所以,你可以使用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 binding那么它仍然应该根据MSDN工作。