0

我有一个 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

4 回答 4

2

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

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

于 2009-05-20T19:00:38.970 回答
1

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

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

笔记:

  • 我认为它必须是一个属性,无论是否自动,因为我发现它有时不会绑定到公共变量。
  • 必须为属性分配一些东西(默认或其他)。
  • 该项目必须有一个无参数的构造函数。
于 2009-05-20T18:10:36.093 回答
1

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

根据DevExpress,您可以使用IList、或. 它们之间的区别在于您是否可以添加新行或者是否可以对控件进行更改。IListSourceITypedListIBindingList

所以你可以使用 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工作。

于 2011-10-26T06:23:18.757 回答
0

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

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

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

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

于 2009-05-19T21:43:56.883 回答