2016-05-29 48 views
0

こんにちは、このguideに沿って、DataGridの使い方を学んでいます。WPF DataGridをDataTableに変換する方法はありますか?

私が遭遇している問題は、DataGridからDataTableにデータを変換する方法です。

DataTable dt = ((DataView)dg.ItemsSource).ToTable(); 

が、それは述べて私にエラーを与える:

私は作業を取得しようとしているコードがある

「タイプ のオブジェクトをキャストすることができませんSystem.Collections.Generic.List `1 [WPFProject.Person] 'を入力して ' System.Data.DataView 'と入力します。

私のコードは、userの代わりにPersonクラスを使用し、DataGridにデータを挿入するためにPerson型のリストを作成する以外は、例と非常によく似ています。

public class Person 
    { 
     public bool CheckBox { get; set; } 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 

ありがとうございます。

答えて

1

あなたはそのように変換することはできません。あなたのコードは、あなたのDataGridItemSourceDataViewでない場合にのみ機能します。明示的にコードを書く必要があります(collection<T>DataTable)、collectionDataTableに変換してください。以下の例を見てい:

XAMLを

<StackPanel> 
    <DataGrid ItemsSource="{Binding list}" x:Name="myGrid"/> 
    <Button Content="convert back" Click="Button_Click_1" /> 
</StackPanel> 

ロジック:

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     var list = new List<MyClass>(myGrid.ItemsSource as IEnumerable<MyClass>); 
     var dataTable = ToDataTable(list); 
     if (dataTable != null) 
     { 

     } 
    } 

    public static DataTable ToDataTable<T>(List<T> items) 
    { 
     DataTable dataTable = new DataTable(typeof(T).Name); 

     //Get all the properties 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     foreach (PropertyInfo prop in Props) 
     { 
      //Setting column names as Property names 
      dataTable.Columns.Add(prop.Name); 
     } 
     foreach (T item in items) 
     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       //inserting property values to datatable rows 
       values[i] = Props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 
     //put a breakpoint here and check datatable 
     return dataTable; 
    } 

出力

Grid

DataTable

0

winformsのようにWPFで行うことはできません。 Wpfでは、DataTable ItemsSourceをこのようなdataTableから設定することができます。あなたのケースでは

dg.ItemsSource = dataTable.AsDataView(); 

あなたはデータグリッドからのdataTableを取得したいです。 以下のコードを試してみてください。

DataView view = (DataView) dg.ItemsSource; 
DataTable dataTable = view.Table.Clone(); 
foreach (var dataRowView in view) 
{ 
    dataTable.ImportRow(dataRowView.Row); 
} 
var dataTableFromDataGrid = dataTable; 
関連する問題