2016-02-04 4 views
2

Я нуждаюсь в преобразовании текущего объекта DataGrid Item Soucrce со всем содержимым в новый DataTable.Преобразование DataGrid.ItemSource в DataTable

Вот мое кодирование, где я вставить все мои информацию в dgFeedbackSelectSupplier «s ItemSource

private void btnFeedbackSelectSupplier_Click(object sender, RoutedEventArgs e) 
{ 
    DataGridTemplateColumn columnFeedbackSupplier = new DataGridTemplateColumn(); 
    columnFeedbackSupplier.Header = "Supplier"; 
    columnFeedbackSupplier.CanUserReorder = true; 
    columnFeedbackSupplier.CanUserResize = true; 
    columnFeedbackSupplier.IsReadOnly = false; 

    var stackPanel = new FrameworkElementFactory(typeof(StackPanel)); 
    stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); 

    DataTemplate cellTemplate = new DataTemplate(); 

    FrameworkElementFactory factoryCheck = new FrameworkElementFactory(typeof(CheckBox)); 
    Binding bindCheck = new Binding("TrueFalse"); 
    bindCheck.Mode = BindingMode.TwoWay; 
    factoryCheck.SetValue(CheckBox.IsCheckedProperty, bindCheck); 
    stackPanel.AppendChild(factoryCheck); 

    FrameworkElementFactory factoryText = new FrameworkElementFactory(typeof(TextBox)); 
    Binding bindText = new Binding("Supplier"); 
    bindText.Mode = BindingMode.TwoWay; 
    factoryText.SetValue(TextBox.TextProperty, bindText); 
    stackPanel.AppendChild(factoryText); 

    cellTemplate.VisualTree = stackPanel; 
    columnFeedbackSupplier.CellTemplate = cellTemplate; 

    DataGridTextColumn columnFeedbackSupplierItem = new DataGridTextColumn(); 
    columnFeedbackSupplier.Header = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Name; 

    dgFeedbackAddCost.SelectAll(); 

    IList list = dgFeedbackAddCost.SelectedItems as IList; 
    IEnumerable<ViewQuoteItemList> items = list.Cast<ViewQuoteItemList>(); 

    var collection = (from i in items 
         let a = new ViewQuoteItemList { Item = i.Item, Supplier = 25, TrueFalse = false } //Remove Supplier(it's for test only) 
         select a).ToList(); 

    dgFeedbackSelectSupplier.Columns.Add(columnFeedbackSupplier); 
    dgFeedbackSelectSupplier.ItemsSource = collection; 

    lblFeedbackRemoveCompany.Content = collection.ToList().Sum(x => x.Supplier); 
} 

В следующем случае, я пытаюсь преобразовать эту ItemSource в новый DataTable, как это:

private void btnFeedbackGetTotals_Click(object sender, RoutedEventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     dt = ((DataView)dgFeedbackSelectSupplier.ItemsSource).ToTable(); //Error here 
     var sum = 0; 
     foreach (DataRow dr in dt.Rows) 
     { 
      foreach (DataColumn dc in dt.Columns) 
      { 
       sum += (int)dr[dc]; 
      } 
     } 
    } 

Но я получаю следующее сообщение об ошибке, когда я запускаю выше метод:

Unabl e для создания объекта типа 'System.Collections.Generic.List`1 [MKCWorkflowApplication.ViewQuoteItemList]' для ввода 'System.Data.DataView'.

У меня нет ни малейшего понятия, почему это происходит, поскольку я думал, что источник источника данных datagrid может быть просто преобразован в новый datatable. Есть ли способ исправить это?

EDIT:

Мой класс 'ViewQuoteItemList'

public class ViewQuoteItemList 
{ 
    public string CustomerRFQ { get; set; } 
    public int QuoteId { get; set; } 
    public int Id { get; set; } 
    public string Item { get; set; } 
    public string Material { get; set; } 
    public string Description { get; set; } 
    public string AdditionalInformation { get; set; } 
    public int Quantity { get; set; } 
    public string Cost { get; set; } 
    public decimal Supplier { get; set; } 
    public bool TrueFalse { get; set; } 

    public string CheckBoxColumn 
    { 
     get { return string.Format("{0} {1}", Supplier, TrueFalse); } 
    } 
} 
+0

Почему вы хотите преобразовать строго типизированный «List » в свободно набранный «DataTable»? –

+0

Спасибо за комментарий Тим. Я не могу понять, как получить общее значение каждого отдельного столбца, добавленного в DataGrid, поэтому я подумал, что если я преобразую его в DataTable, то я бы более легко мог получить нужные мне значения – CareTaker22

ответ

1

Почему вы хотите, чтобы преобразовать сильно типизированных List<ViewQuoteItemList> к слабо типизированным DataTable вообще? Вам не нужен DataTable, вы можете использовать следующий запрос LINQ.

var source = (List<ViewQuoteItemList>) dgFeedbackSelectSupplier.ItemsSource; 
int sum = source.Sum(x => x.Prop1 + x.Prop2 + x.Prop3); // change accordingly 

Если это не поможет, вы должны показать нам класс ViewQuoteItemList.

+0

I добавили Редактировать в мой пост. Я продолжу и попробую ваш предложенный ответ быстро – CareTaker22

+0

Он отлично работает благодаря Тиму :) – CareTaker22

Смежные вопросы