我有一个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查询设置为数据源,但我还想在设计时指定视图的外观。
答案 0 :(得分:2)
如果希望DevExpress网格自动获取数据源的列,则必须为LINQ查询的返回类型定义一个类。在设计时,WinForm绑定引擎使用反射或ICustomTypeDescriptor,如果源实现它以自动发现数据源的属性,类型等。 DevExpress网格正在使用此底层绑定机制,并根据属性信息在设计时自动为您生成列。但是,在您的情况下,您在LINQ查询中创建了一个匿名类型,该类型在设计时是未知的或可用的。因此,DevExress Grid无法自动生成列。正如@Dennis所提到的,您可以在设计器中手动将列添加到网格中。您需要确保列上的'FieldName'与数据源上的属性名称匹配。
如果您使用类,您可能还需要实现INotifyPropertyChanged以使网格了解数据源中的数据更改。
答案 1 :(得分:1)
考虑到这一点:如果您在设计时通过向导或在运行时的代码中创建列,只要您设置列的FieldName属性,它们将显示数据源中具有该属性的数据名。
注意:
答案 2 :(得分:1)
这些字段在设计时已知(Field1,Field2,Field3)。
根据DevExpress,您可以使用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 binding,那么它仍然可以根据MSDN进行测试。
答案 3 :(得分:0)
我没有使用DevExpress网格,但我已经使用.NET DataGridView做了很多。
DevExpress网格是否具有与自动生成列的.NET DataGridView相同的功能?
如果是这样,那么它应该显示在查询中找到的任何字段,并将使用Field1,Field2和Field3(来自您的示例代码)作为列名。
或者只是关闭自动生成列功能并在设计时添加列。只要它们匹配您的查询返回的内容,它就可以正常工作。