2013-10-11 91 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

相關問題