2013-10-11 49 views
0

我有一个DataGrid,填充后我想将其导出为Excel格式。到目前为止,我能够做到这一点。我尝试对列顺序进行排序时出现问题。头是按照正确的顺序构建的,但DataGridRows不是。WPF DataGridRow在列排序后不更新单元格顺序

所述的图像显示了最终的结果:

Column Sort

在这个例子中我换用“TIPO Entidade”的“ID Equipa”列,然而,在Excel文件(在右侧)的行值会继续,好像没有更改发生时头很好地更新。

不知道这是否会有所帮助,但我的“ExportToExcel”类是基于对这个项目ExportToExcel Project但不是使用它的类标识符

public class ExportToExcel<T, U> 
where T : class 
where U : List<T> 
{ 
    // ... 
} 

我创造了这个一个

public class ExportToExcel 
} 
    public ExportToExcel(List<DataGridColumn> columns, List<DataGridRow> dataToFill) 
     { 
      // ... 
     } 
} 

我认为问题出在我的'dataToFill'参数中,因为它保持默认的单元格顺序,并且在列排序事件后不更新。

我不明白为什么会发生这种情况。如果有人能够解决这个问题,我会非常感激。

感谢

编辑:

继谢里登的意见,我张贴一些额外的代码。

我这是怎么提取的DataGrid行

public IEnumerable<DataGridRow> GetDataGridRows() 
    { 
     var itemsSource = dgEntities.ItemsSource as IEnumerable; 
     if (null == itemsSource) yield return null; 
     foreach (var item in itemsSource) 
     { 
      var row = dgEntities.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 
      if (null != row) 
      { 
       if (dgEntities.SelectedItems.Count == 0) yield return row; 
       else if (row.IsSelected) yield return row; 
      } 
     } 
    } 

这里就是我instaciate的ExportToExcel类

public void ExportToExcel() 
    { 
     if (dgEntities.ItemsSource != null) 
     { 
      try 
      { 
       BLL.ExportToExcel export = new ExportToExcel(dgEntities.Columns.ToList(), GetDataGridRows().ToList()); 
       export.GenerateReport(); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.ToString()); 
      } 
     } 
    } 

这下一位是我从我所提到的CodeProject上项目的原代码覆盖早期的

private object[] CreateHeader() 
    { 
     // Create an array for the headers and add it to the 
     // worksheet starting at cell A1. 
     List<object> objHeaders = new List<object>(); 
     foreach (DataGridColumn dgc in Columns) 
     { 
      if (dgc.Visibility == System.Windows.Visibility.Visible) objHeaders.Add(dgc.Header); 
      else deletedColumns.Add(dgc.DisplayIndex); 
     } 

     var headerToAdd = objHeaders.ToArray(); 
     AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd); 
     SetHeaderStyle(); 

     return headerToAdd; 
    } 

    private void WriteData(object[] header) 
    { 
     object[,] objData = new object[DataToFill.Count, header.Length]; 

     for (int j = 0; j < DataToFill.Count; j++) 
     { 
      DataGridRow row = DataToFill[j]; 
      int i = 0; 
      for (int x = 0; x < Columns.Count; x++) 
      { 
       if (!deletedColumns.Contains(x)) 
       { 
        DataGridCell cell = GetCell(row, j, x); 
        if (cell != null && cell.Content is TextBlock) 
        { 
         objData[j, i] = ((TextBlock)cell.Content).Text; 
         i++; 
        } 
       } 
      } 
     } 
     AddExcelRows("A2", DataToFill.Count, header.Length, objData); 
     AutoFitColumns("A1", DataToFill.Count + 1, header.Length); 
    } 

回答

0

你真的不应该使用你的代码d不明白...这是使用你在互联网上找到的代码的问题。

如果您在CreateHeader方法看,你会看到标题标题来自行:

PropertyInfo[] headerInfo = typeof(T).GetProperties(); 

这仅仅是通过在类中定义的属性进行迭代,并承担无相关性的排序的数据。要以简单的方式解决您的问题,只需重新排序headerInfo变量以匹配您的排序数据。

但是,我会建议您解决您的问题了解您的代码在做什么然后根据您的要求进行调整。

UPDATE >>>

看到你通过你的DataGrid.ItemsSource集合迭代之后,我猜那是你的问题,因为该集合将在UI分类之后保持不变。您有几个选择...一种方法是更新绑定到ItemsSource属性的实际集合,以响应用户在网格中各种标题的点击 - 这样,您当前的数据提取方法就可以工作。

也许使用将是一个比较常见的方法使用CollectionViewSource对象您的收藏和DataGrid.ItemsSource之间...请参见MSDN上CollectionViewSource Class页的帮助,这其中包括XAML的例子。基本上,使用此方法时,您可以从CollectionViewSource对象获取的已排序(并已过滤)状态的副本。

+0

我从我的类中删除了该代码,并从头开始构建了CreateHeader方法,并且它工作正常......问题不在于标题,而是在没有按照DataGrid标题排序的行中... – David

+0

然后你的问题就在'WriteData'方法中......在那里放置一个断点,看看实际发生了什么。 – Sheridan

+0

大概是这样,但是当我调试它时,这些值是默认的列顺序......所以我倾向于认为可能问题在于我在将它传递给ExportToExcel类之前如何提取列表 David

相关问题