我正在使用WPF,我有一个绑定到对象列表的DataGrid,每个属性都有一列:
<DataGrid x:Name="Docs" Margin="29,211,25,66" IsReadOnly="False" AutoGenerateColumns="False"
DataContext="{Binding Source={StaticResource Rutine}}" CanUserReorderColumns="False"
ItemsSource="{Binding Documents,Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Document Type" Binding="{Binding DocumentType}" />
<DataGridTextColumn Header="Document (Name)" Binding="{Binding DocumentName}" /></DataGrid.Columns></DataGrid>
public IList<CSDoc> Documents
{
get
{
return _Documents;
}
set
{
_Documents = value;
NotifyPropertyChanged("Documents");
}
}
public class CSDoc
{
public string DocumentType{ get; set; }
public string DocumentName{ get; set; }
}
我允许用户更改数据,以便以后可以将其导出到xlsx文件
但我需要一个DataTable对象来做到这一点
另一个问题是我需要Headers,因为xlsx文件稍后上传到另一个使用空格和括号进行验证的系统。
有没有办法从DataGrid用户视图创建DataTable而不循环每个单元格?
并且由于每个Header,没有对象列表也被循环...
答案 0 :(得分:0)
制作lui
工具CSDoc
(以实现TwoWay绑定),并在ViewModel图层中处理它。
要将INotifyPropertyChanged
转换为DataTable,您可以手动执行此操作(如果只有两列(更快),或使用此处概述的通用方法:Convert generic List/Enumerable to DataTable?
答案 1 :(得分:0)
我认为此帖很好地涵盖了您的问题Convert generic List/Enumerable to DataTable? 或者你可以使用迭代方式。
try
{
var dataTable = new DataTable();
dataTable.Columns.Add("DocumentType");
dataTable.Columns.Add("DocumentName");
foreach (CSDoc Myelement in Documents)
{
var newRow = dataTable.NewRow();
// fill the properties into the cells
newRow["DocumentType"] = element.DocumentType;
newRow["DocumentName"] = element.DocumentName;
dataTable.Rows.Add(newRow);
}
// export to an xlsx file
}
catch (Exception e)
{
MessageBox.Show("error" + e.ToString());
}