我有一个返回DbDataReader对象的模块。这是一个经过尝试和信任的模块,在Windows.Forms中与DataTable/DataGridView一起在生产中使用,所以我不想更改它。
我尝试对WPF做同样的操作,将DataTable传递给ItemsSource,但失败了,因为它需要一个DataTable没有实现的IEnumerator。
我记得DbDataReader确实实现了那个接口,我突然想到ItemsSource可能想将数据读取到内部缓冲区中,所以我尝试传递DbDataReader,它成功了。。。。直到我用finally子句完成了代码!
然后我发现DataTableExtensions确实允许我从DataTable中获取枚举器。但它似乎并没有迭代数据!
请注意,我不需要编辑数据,我从DbDataReader得到的数据很好,我只需要一份可用于网格的数据副本。。。我怎么能做到这一点,一定很简单!
谢谢你的帮助!
根据要求,这里有代码;
这基本上就是我习惯用Windows窗体做的事情:
DbDataReader dr=null;
DataTable dt=null;
try{
dr = AModule.FetchData(Params....);
dt.Load(dr);
}
finally{
if(dr!=null)dr.Close();
}
dataGridView1.DataSource=dt;
WPF的等价物是什么?
我最终解决了这个问题。
我发现了几个类似的帖子,建议使用:
DataTableExtensions.AsEnumerable(DataTable dt);
获取DataTable的枚举器接口,但这根本不起作用。
但是使用:
DataTableExtensions.AsDataView(DataTable dt);
用DataView类封装DataTable,这与WPF的DataGrid兼容。