我在VSTO-AddIn内的WPF窗口中实现了DataGrid
,它应该在将数据粘贴到现有Excel工作表之前预览数据。 CanUserSortColumns-Property
设置为true
,因此用户可以在将列读出并粘贴到工作表之前重新排列列。但是,当我从DataRows
读出DataGrid
时,如下所示,列已回到原始位置。
object[,] dataArray = new object[allRows, allCols];
for (int r = 0; r < allRows; r++)
{
DataRow row = ClientGrid.Rows[r];
for (int c = 0; c < allCols; c++)
{
dataArray[r, c] = row[c];
}
}
这是我的问题:有没有办法以快速的方式解决这个问题,或者至少跟踪列显示索引的变化,以便在每次更改列显示顺序时重新排列代码中的列顺序?
我已经尝试过使用DisplayIndex
- 属性来解决问题,但我并没有完全了解它所吐出的数字。
答案 0 :(得分:0)
您可以按DisplayIndex
属性对列进行排序,并使用反射使用反射导出值,例如:
public static void ExportUsingRefection(this DataGrid grid)
{
if (grid.ItemsSource == null || grid.Items.Count.Equals(0))
throw new InvalidOperationException("You cannot export any data from an empty DataGrid.");
IEnumerable<DataGridColumn> columns = grid.Columns.OrderBy(c => c.DisplayIndex);
ICollectionView collectionView = CollectionViewSource.GetDefaultView(grid.ItemsSource);
foreach (object o in collectionView)
{
if (o.Equals(CollectionView.NewItemPlaceholder))
continue;
foreach (DataGridColumn column in columns)
{
if (column is DataGridBoundColumn)
{
string propertyValue = string.Empty;
/* Get the property name from the column's binding */
BindingBase bb = (column as DataGridBoundColumn).Binding;
if (bb != null)
{
Binding binding = bb as Binding;
if (binding != null)
{
string boundProperty = binding.Path.Path;
/* Get the property value using reflection */
PropertyInfo pi = o.GetType().GetProperty(boundProperty);
if (pi != null)
{
object value = pi.GetValue(o);
if (value != null)
propertyValue = value.ToString();
}
}
}
//...
}
}
}
}
有关详细信息,请参阅以下博文。
如何从WPF中的DataGrid导出数据: https://blog.magnusmontin.net/2013/09/29/export-data-from-a-datagrid/
答案 1 :(得分:0)
我最终做了以下事情:
读出DisplayIndex-Property
和每列的初始位置,然后按DisplayIndex-Property
排序元组
var columnIndices = new List<Tuple<int,int>>();
var colCounter = 0;
foreach (var col in myDataGrid.Columns)
{
columnIndices.Add(Tuple.Create(col.DisplayIndex, colCounter));
colCounter += 1;
}
var sortedColumns = columnIndices.OrderBy(x => x.Item1).ToList();
创建一个空DataTable
并将原始DataGrid's
列添加到其中。然后,我将新DataTable's
DataRow's
个单元格设置为等于原始DataRows
的{{1}}的单元格。
DataGrid