我在 VB 中有以下内容:
Dim sources = From source In importSources Select New With _
{.Type = source.Key, .Source = source.Value.Name}
dgridSourceFiles.DataSource = sources
当我调试时,sources
显示一个内存中查询,其中有 2 条记录。然而数据 GridView 不会显示记录。
那么为什么这行不通?建议可以是 VB 或 C#...
更新
当我使用时:
Dim sources = (From source In importSources Select New With _
{.Type = source.Key, .Source = source.Value.Name}).ToList()
...显示数据源。
最佳答案
您的 LINQ 查询被延迟评估并实现了 IEnumerable<T>
仅接口(interface)(据我所知),这意味着它的结果直到枚举器调用 MoveNext
才建立某处(例如,在 foreach
循环中发生)。
似乎DataSource
property 不会以这种方式枚举其内容。它完全期待 IList
的实现(或其他几个接口(interface)之一——见下文)以便它可以按索引访问项目。这由控件在内部用于排序、过滤等。考虑到这一点,很可能所有设置 DataSource
property 的作用是检查对象的类型以查看它是否实现了任何受支持的接口(interface)。所以我不认为 DataSource
property 旨在处理这种类型的对象(惰性求值查询)。
现在,ToList
调用填充 List<T>
查询结果;这确实实现了IList
因此可以用作 DataSource
.
我的理解是原因DataSource
仅输入为 object
是它需要以下接口(interface)中的任何:
-
IList
-
IListSource
(在这种情况下,IListSource.GetList
方法与DataMember
属性一起用于向控件提供数据) -
IBindingList
(它将列表中的更改传播到控件以进行 UI 更新) -
IBindingListView
(比如BindingSource
)
这是根据 MSDN documentation .
关于vb.net - 为什么这个关于 Dictionary<TKey, TValue> 的 Linq 查询不作为 DataSource 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4502827/