2016-05-29 3 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 '.

Мой код очень похож на пример, за исключением того,

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

спасибо.

ответ

1

Вы не можете преобразовать это так. Ваш код будет работать, только если ItemSource вашего DataGrid не является DataView. Вам необходимо явно написать код (который вы можете легко найти в любом collection<T> до DataTable), чтобы преобразовать collection в DataTable. посмотрим на примере ниже:

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

Вы не можете сделать это в WPF, как в winforms. В Wpf вы можете установить datagrid ItemsSource из dataTable, как это.

dg.ItemsSource = dataTable.AsDataView(); 

В вашем случае, если вы хотите получить DataTable от DataGrid. Итак, вы можете попробовать с помощью кода ниже.

DataView view = (DataView) dg.ItemsSource; 
DataTable dataTable = view.Table.Clone(); 
foreach (var dataRowView in view) 
{ 
    dataTable.ImportRow(dataRowView.Row); 
} 
var dataTableFromDataGrid = dataTable; 
Смежные вопросы