Vb.net 为什么不是';t这是字典上的Linq查询<;TKey,TValue>;作为数据源工作

Vb.net 为什么不是';t这是字典上的Linq查询<;TKey,TValue>;作为数据源工作,vb.net,winforms,linq,datagridview,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条记录。但是datagrid视图不会显示记录 那么为什么这不起作用呢?建议可以是VB或C# 更新 当我使用: Dim

我在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()

…将显示数据源。

您的LINQ查询将被延迟评估,并仅实现
IEnumerable
接口(据我所知),这意味着只有在枚举器调用
MoveNext
某个地方(例如,在
foreach
循环中发生的情况)时,才会建立其结果

DataSource
属性似乎没有以这种方式枚举其内容。它完全希望实现
IList
(或下面的几个其他接口之一),以便可以通过索引访问项目。控件内部使用它进行排序、筛选等。考虑到这一点,
DataSource
属性的所有设置可能都是检查对象的类型,以查看它是否实现了任何受支持的接口。因此,我认为
DataSource
属性根本不适合处理这种类型的对象(一个延迟计算的查询)

现在,该
ToList
调用用查询结果填充
列表
;这确实实现了
IList
,因此可以用作
数据源

我的理解是,之所以将
数据源
键入为
对象
,是因为它需要以下任何接口:

  • (在这种情况下,
    IListSource.GetList
    方法与
    DataMember
    属性一起使用,以向控件提供数据)
  • (将列表中的更改传播到控件以进行UI更新)
  • (像)

这是根据。

设置源后,可能需要调用数据绑定。尝试:

dgridSourceFiles.DataSource = sources
dgridSourceFiles.DataBind()

我不这么认为。DataSource上的MSDN文档说明它必须为Nothing或实现IEnumerable或IListSource@jwiscarson:您发布的链接是针对
System.Web.UI.WebControls.BaseDataList
,而不是
DataGridView
(这是一个Windows窗体控件)。@Dan,您是对的,关于WinForms grids的数据源对象也是对的。OP需要更新这篇澄清WebForms与WinForms的文章。我把“datagrid视图”误解为datagrid的一般视图。@jwiscarson:当然可以更清楚,但问题确实包括标签
datagridview
;我想我们在这里讨论WinForms。同意,和+1。我从来没有提交过这个问题的答案,因为这个问题太让人困惑了,我不知道这篇文章中遗漏了什么细节会导致这个问题,所以你的答案特别有见地。我在DataGridView上没有
DataBind()
方法。当我看到另一个解决方案时,我就想到了这一点。我大部分时间都生活在网络世界中,所以我想到了GridView控件。:-)