我不习惯使用 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()
});
答案 0 :(得分:0)
在没有更好的解决方案的情况下,我使用了DataTableProxy nuget包,它将从常规IEnumerable<T>
中生成DataTable,从我的代码中删除数据表,并使用{{1相反(因为我不想仅仅为了编辑网格而创建数据表的第二个实例) - 使用包创建一个DataTable。
我有可编辑的网格,但我对更简单的解决方案仍持乐观态度: - )