【问题标题】:LINQ and Devexpress Grid DatasourceLINQ 和 Devexpress 网格数据源
【发布时间】:2009-05-19 21:35:20
【问题描述】:

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

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

【问题讨论】:

    标签: linq grid datasource devexpress


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      注意事项:

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

      【讨论】:

        【解决方案3】:

        这些字段在设计时是已知的(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 工作。

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多