我在VB中有以下内容:
Dim sources = From source In importSources Select New With _
{.Type = source.Key, .Source = source.Value.Name}
dgridSourceFiles.DataSource = sources
当我调试时,sources
显示内存中查询并且其中有2条记录。然而,datagrid视图不会显示记录。
那么为什么这不起作用?建议可以是VB或C#...
当我使用时:
Dim sources = (From source In importSources Select New With _
{.Type = source.Key, .Source = source.Value.Name}).ToList()
...显示数据源。
答案 0 :(得分:6)
您的LINQ查询被懒惰地评估并且仅实现IEnumerable<T>
接口(据我所知),这意味着在枚举器在某处调用MoveNext
之前不会建立它的结果(如同{例如,{1}}循环。
似乎foreach
属性不会以这种方式枚举其内容。它完全期望DataSource
(或其他一些接口之一 - 见下文)的实现,以便它可以按索引访问项目。这由控件在内部用于排序,过滤等。考虑到这一点,所有设置IList
属性的工作都可能是检查对象的类型以查看它是否实现了任何支持的接口。所以我认为DataSource
属性不是为了处理这种类型的对象(一个懒惰的评估查询)而设计的。
现在,DataSource
调用会使用您的查询结果填充ToList
;此 实施List<T>
,因此可以用作IList
。
我的理解是,DataSource
仅仅作为DataSource
输入的原因是它需要以下接口的任何:
IList
IListSource
(在这种情况下,object
方法与IListSource.GetList
属性一起使用,以向控件提供数据)IBindingList
(将列表中的更改传播到UI更新的控件)IBindingListView
(如BindingSource
)这是根据MSDN documentation。
答案 1 :(得分:1)
设置源后,您可能需要调用DataBind。尝试:
dgridSourceFiles.DataSource = sources
dgridSourceFiles.DataBind()