如何在读取DataGrid时保存重新排列的列位置?

时间:2017-10-04 09:47:42

标签: c# wpf excel datagrid datagridcolumn

我在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 - 属性来解决问题,但我并没有完全了解它所吐出的数字。

2 个答案:

答案 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)

我最终做了以下事情:

  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的{​​{1}}的单元格。

    DataGrid