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 查询的返回类型定义一个类。在设计时,WinForm 绑定引擎使用反射或 ICustomTypeDescriptor(如果源实现它来自动发现数据源的属性及其类型等)。DevExpress 网格正在使用这种底层绑定机制,并在设计时根据属性信息自动为您生成列。但是,在您的情况下,您在 LINQ 查询中创建匿名类型,该类型在设计时未知或不可用。因此,DevExress Grid 无法自动生成列。正如@Dennis 提到的,您可以在设计器中手动将列添加到网格中。我相信,您需要确保列上的“FieldName”与数据源上的属性名称匹配。
如果您使用类,您可能还需要实现 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 绑定 那么它仍然应该按照 微软软件定义网络.
我没有使用过 DevExpress 网格,但我使用 .NET DataGridView 做了很多工作。
DevExpress 网格是否具有与自动生成列的 .NET DataGridView 相同的功能?
如果是这样,那么它应该显示在查询中找到的任何字段,并将使用 Field1、Field2 和 Field3(来自示例代码)作为列名称。
或者只是关闭自动生成列功能并在设计时添加列。只要它们与您的查询返回的内容匹配,它就应该可以正常工作。