将常规IEnumerable集合转换为DataView的最短方法

时间:2015-07-08 10:01:04

标签: c# wpf datatable extension-methods wpfdatagrid

我不习惯使用 DataTables 及其所有内置功能,而是通常将其用于调试视觉显示功能。

我是WPF的新手,虽然我对linq / IEnumerable扩展方法很有经验,但我学会了一个DataGrid,为了支持编辑,你分配给 ItemsSource 属性的对象必须实现一个给定的接口(我不确定它是什么,暂时让它说它是IEditableCollectionView或IBindingList)。

由于我习惯通过IEnumerable扩展方法进行集合操作,所以我可以轻松地操作数据表,过滤它并仅投影我想要的列:

        grdSettings.ItemsSource =
                _settings
                .AsEnumerable()
                .Where(row => row["table"].ToString().Equals(e.AddedItems[0].ToString()))
                .Select(s => new
                    {
                        Setting = s["field"],
                        Description = s["description"],
                        CharValue = s["charValue"],
                        NumMinValue = s["minValue"],
                        NumMaxValue = s["maxValue"]
                    });

问题在于网格不可编辑。如果我指定_settings.AsDataView(),则网格是可编辑的。我的问题是我不想要所有的列,我不能让(我不知道怎么样)一个IEnumerable进入DataView。我阅读了一些关于从数据表/数据视图中过滤列的帖子,但解决方案看起来有点尴尬,不像我想的那样顺利......

我是否只缺少一小部分我可以“插入”我的解决方案,而不必放弃IEnumerable扩展方法过滤...?

更新 Mike Eason 下面建议用预定义的类型替换我的匿名类型,说明匿名类型是只读的,这就是为什么网格的集合源没有支持编辑。

这是使用强类型对象的更新,但它仍然不起作用。实际上,根据上面提到的前提,单独认为这样做是没有意义的,为了让网格允许编辑它的集合源对象必须实现给定的接口。

        grdSettings.ItemsSource =
                _settings
                .AsEnumerable()
                .Where(row => row["table"].ToString().Equals(e.AddedItems[0].ToString()))
                .Select(s => new GridRecord
                    {
                        Setting = s["field"].ToString(),
                        Description = s["description"].ToString(),
                        CharValue = s["charValue"].ToString(),
                        NumMinValue = s["minValue"].ToString(),
                        NumMaxValue = s["maxValue"].ToString()
                    });

1 个答案:

答案 0 :(得分:0)

在没有更好的解决方案的情况下,我使用了DataTableProxy nuget包,它将从常规IEnumerable<T>中生成DataTable,从我的代码中删除数据表,并使用{{1相反(因为我不想仅仅为了编辑网格而创建数据表的第二个实例) - 使用包创建一个DataTable。

我有可编辑的网格,但我对更简单的解决方案仍持乐观态度: - )