2017-10-04 7 views
0

私はDataGridを、既存のExcelシートに貼り付ける前にユーザーにプレビューする予定のVSTO-AddInの中のWPFウィンドウに実装しました。 CanUserSortColumns-Propertytrueに設定されているため、ユーザーは読み込まれてシートに貼り付けられる前に列を並べ替えることができます。しかし、DataGridから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

私は、DataGrid、データソースとデータバインディングを使用して、しばらく前に同じ問題を抱えていました。私はDataGridをあきらめ、ListViewを代わりに使用しました。しかし、セルを編集する必要がある場合は、WPFの「ItemsControl」がはるかに優れたソリューションになります。 – Bijan

答えて

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. のCre空のDataTableで元のDataGrid's列を追加してください。次に、新しいDataTable'sDataRow'sセルを元のDataGridDataRowsのセルと等しく設定しました。

    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); 
    } 
    
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のデータグリッドからデータをエクスポートする方法:https://blog.magnusmontin.net/2013/09/29/export-data-from-a-datagrid/

関連する問題