vb.net - 为什么这个关于 Dictionary<TKey, TValue> 的 Linq 查询不作为 DataSource 工作

标签 vb.net winforms linq datagridview datasource

我在 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)中的任何:

这是根据 MSDN documentation .

关于vb.net - 为什么这个关于 Dictionary<TKey, TValue> 的 Linq 查询不作为 DataSource 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4502827/

相关文章:

ASP.NET:TextBox.Text 没有更新的值

c# - 一个类的某些实例而不是其他实例的静态/共享变量

c# - 上下文菜单项的点击不触发

vb.net - WinForms TableLayoutPanel ComboBox 无法正确调整大小

.net - LINQ 查询的索引

.net - 如何查看 SQL 事务上待处理的更改?

wpf - Visual Studio 2010 如何引用项目中的文件夹?

c# - 在将图像用作 PictureBox 的源后,如何从文件夹中删除这些图像?

c# - Linq 查询 - 为每个不同的列 A 查找两个最近的时间戳

c# - 将 SortedList 转换为 IOrderedEnumerable