我正在开发一个包含许多列表视图的应用程序,每个listview都绑定到一个ObservableCollection,每个可观察的集合都包含不同的自定义对象类型。
我需要一个方法,将listview作为参数(无论它包含什么类型的对象),并迭代其项目和单元格以将数据写入excel文件。
我可以从ItemContainerGenerator获取ListViewItem,但我无法迭代列。我也试图获得GridViewRowPresenter,但我什么都没有,因为我达到了一个点,我必须将我的对象解包到特定的数据类型。
答案 0 :(得分:0)
在最简单的模型中,您可以使用ListView.Items.SourceCollection
与Column.DisplayMemberPath
结合来获取对数据绑定对象和您应该打印的属性的引用。
ListView lv = /* magically got a reference to the listview */;
var collection = lv.Items.SourceCollection;
var columns = ((GridView)lv.View).Columns;
// I am assuming you already have an excel writer
// write the headers
excelWriter.StartRow();
foreach (var header in columns)
{
excelWriter.WriteCell(header.Header);
}
excelWriter.EndRow();
// get propertyinfo
// this will fail if there are no items in the collection
var tDataItem = collection.First().GetType();
// this will fail for anything but the most simple bindings
var piColumns = columns.Select(c => tDataItem.GetProperty(((Binding)c.DisplayMemberBinding).Path));
// start data
foreach (var dataitem in collection)
{
excelWriter.StartRow();
foreach (var pi in piColumns)
{
var propValue = pi.GetValue(dataItem, null);
// given that this is of type object, you will probably have to format this
excelWriter.WriteCell(propValue);
}
excelWriter.EndRow();
}
您可以使用的另一个模型是try and read the cell values from the automation interface。我知道DataGrid
支持自动化,但我不确定GridView
。