0

DataGrid在 VSTO-AddIn 内的 WPF 窗口中实现了一个,它应该在将数据粘贴到现有 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-property 解决问题,但我并没有完全掌握它吐出的数字。

4

2 回答 2

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/

于 2017-10-04T10:06:09.103 回答
0

我最终做了以下事情:

  1. 读出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();        
    
  2. 创建一个空DataTable并将原始DataGrid's列添加到它。然后我将新DataTable's DataRow's单元格设置为等于DataRows原始单元格的单元格DataGrid

    var myDataTable = new DataTable();
    
    foreach (var index1 in sortedColumns)
    {
        var columnName = myDataGrid.Columns[index1.Item2].ColumnName;
        myDataTable.Columns.Add(columnName, myDataGrid.Columns[index1.Item2].DataType);
    }
    
    foreach (DataRow dr in myDataGrid.Rows)
    {
        var itemArray = new object[allCols];
        var indexer = 0;
    
        foreach (var index2 in sortedColumns)
        {
            itemArray[indexer] = dr[index2.Item2];
            indexer += 1;
        }
    
        myDataTable.Rows.Add(itemArray);
    }
    
于 2017-10-12T17:04:43.210 回答