LINQ和Devexpress网格数据源

时间:2009-05-19 21:35:21

标签: linq grid datasource devexpress

我有一个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查询设置为数据源,但我还想在设计时指定视图的外观。

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

4 个答案:

答案 0 :(得分:2)

如果希望DevExpress网格自动获取数据源的列,则必须为LINQ查询的返回类型定义一个类。在设计时,WinForm绑定引擎使用反射或ICustomTypeDescriptor,如果源实现它以自动发现数据源的属性,类型等。 DevExpress网格正在使用此底层绑定机制,并根据属性信息在设计时自动为您生成列。但是,在您的情况下,您在LINQ查询中创建了一个匿名类型,该类型在设计时是未知的或可用的。因此,DevExress Grid无法自动生成列。正如@Dennis所提到的,您可以在设计器中手动将列添加到网格中。您需要确保列上的'FieldName'与数据源上的属性名称匹配。

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

答案 1 :(得分:1)

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

考虑到这一点:如果您在设计时通过向导或在运行时的代码中创建列,只要您设置列的FieldName属性,它们将显示数据源中具有该属性的数据名。

注意:

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

答案 2 :(得分:1)

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

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

所以你可以使用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进行测试。

答案 3 :(得分:0)

我没有使用DevExpress网格,但我已经使用.NET DataGridView做了很多。

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

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

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