2013-09-12 6 views
0

У меня возникла проблема с получением данных gridview и преобразованием его в DataTable. На самом деле его, как некоторые из датааридов в моей заявке, имеют ItemsSource, которые я могу отличить как DataView, но другой получил ItemsSource, определенный в приложении.Получите данные DataGrid типа Data и литые как это

Например:

DataGrid1 - ItemsSource = DataView (прямо из базы данных) DataGrid2 - ItemsSource = ObservableCollection Продукта DataGrid3 - ItemsSource = ObservaleCollection Категорий

Ошибки я получаю:

Тип объекта System.Collections.ObjectModel.ObservableCollection`1[myApp.Product] тип System.Data.DataView.

Я хочу, чтобы достичь чего-то вроде этого:

DataTable dt = null; 
    try 
    { 
     dt = ((DataView)dg.ItemsSource).ToTable(); 
    } 
    catch 
    { 
     Type t = dg.ItemsSource.GetType(); 
     dt = ((t)dg.ItemsSource).ToTable(); 
    } 

Так на самом деле я хотел бы получить коллекцию в качестве объекта и бросить ItemsSource в DataTable.

Возможно ли это?

ответ

0

Да, это возможно ... сказали, что ваша ошибка

Невозможно привести объект типа 'System.Collections.ObjectModel.ObservableCollection`1 [myApp.Product] к типу «System.Data. DataView '

Это означает, что между этими классами нет прямой зависимости от каста. Для того, чтобы обеспечить, что вы должны были бы расширить ObservableCollection<T> класс и переопределить оператор explicit произнесения:

public class MyObservableCollection : ObservableCollection<YourDataType> 
{ 
    public static explicit operator DataView(MyObservableCollection collection) 
    { 
     DataTable table = new DataTable(); 
     foreach (YourDataType item in collection) 
     { 
      // fill your DataTable however you want to here 
     } 
     return new DataView(table); 
    } 
} 

Вы можете узнать больше из explicit (C# Reference) страницы в MSDN. Вы можете узнать, как заполнить DataTable с страницы DataView.Table Property в MSDN.

ОБНОВЛЕНИЕ >>>

Это не метод. Это оператор литья. Он используется для литья одного типа в другой. Как (int) в следующем примере:

int intValue = (int)doubleValue; 

Вы спросили, как бросить ObservableCollection в DataView. Мой ответ показывает вам, как сделать именно это:

DataView dataView = (DataView)yourCustomObservableCollection; 

Или от ВАШЕГО Например:

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

... при условии, что есть экземпляр этого пользовательского MyObservableCollection множества как dg.ItemsSource.

Вы сказали

DataGrid2 - ItemsSource = ObservableCollection Продукта DataGrid3 - ItemsSource = ObservaleCollection Категорий

  1. Так первый, создать новый класс, как я показал вам ... вызова это все, что вам нравится.

  2. Затем замените свои текущие экземпляры ObservableCollection на новые экземпляры MyObservableCollection.

Всё. Я не знаю, как это объяснить. Если вы действительно не понимаете этого, то вам некуда задавать эти вопросы. Я предлагаю вам перейти в MSDN, чтобы узнать все о кастинге, а затем вернуться, чтобы понять это.

+0

Спасибо за быстрый ответ, но на самом деле это первый раз, когда я вижу что-то вроде явного оператора. Если возможно, можете ли вы поделиться некоторым примером кода, как его использовать? Например, для типа «Продукт». Заранее спасибо! – user13657

+0

Я изменил первую ссылку в своем ответе (явный (ссылка на C#)) на страницу, объясняющую ее использование, и предоставляет примеры на C#. Дополнительную информацию см. На этой странице. – Sheridan

+0

Хм, в примере, который вы показываете, есть Fahrenheit f = new Fahrenheit (100.0f); , которые запускают открытый статический явный оператор Celsius (Fahrenheit f) с параметром. Так мой, может быть, глупый вопрос в том, что мне следует передать, чтобы получить объект возврата как datatable? – user13657