2014-10-15 2 views
1

У меня есть datagrid, который отображает элементы. Datagrid привязан к свойству DataGridItems типа ObservableCollection. В коде я динамически создавать экземпляры DataGridItems свойств, как это:DataExport от DataGrid: замените переключатель/фразу на что-то более общее

this.DataGridItems = Db.Instance.RetrieveFoldingBoxes(); 

или

this.DataGridItems = Db.Instance.RetrieveLabels(); 

Теперь я хочу, чтобы экспортировать данные, отображаемые (и отфильтрованные/отсортированные) в DataGrid. я мог бы сделать это следующим образом:

private void ExportData(ControlDataGrid dataGrid) 
    { 
     if (dataGrid == null) return; 

     //items is type of Telerik.Windows.Data.DataItemCollection 
     var items = dataGrid.GetFilteredCollection(); 

     switch (this.GetSelectedViewComboBoxItemName) 
     { 
      case "Folding Box": 
       var exportItems1 = items.Cast<View_DataExport_FoldingBox>(); 
       this.GenericExport(exportItems1); 
       break; 

      //30 cases more... 

      case "Label": 
       var exportItems2 = items.Cast<View_DataExport_Label>(); 
       this.GenericExport(exportItems2); 
       break; 
     } 
    } 

    private void GenericExport<T>(IEnumerable<T> list) { ... } 

Но я на самом деле это не нравится из-за этой высокой избыточностью. Было бы гораздо более изящным Если бы я мог сделать что-то вроде этого:

private void ExportData(ControlDataGrid dataGrid) 
    { 
     if (dataGrid == null) return; 

     //items == Telerik.Windows.Data.DataItemCollection 
     var items = dataGrid.GetFilteredCollection(); 

     //Getting the generic type in pseudo code 
     //Also far from a good solution because I think CurrentItem could be null 
     if(items.CurrentItem == null) return; 
     var type = Type.GetType(items.CurrentItem); 

     var exportItems = items.Cast<type>(); 

     this.GenericExport<type>(exportItems); 
    } 

Я уверен, что это можно как-то, но в настоящее время я понятия не имею, как это сделать.


EDIT: вот код для метода GenericExport:

private void GenericExport<T>(IEnumerable<T> list) 
    { 
     using (var excelPackage = new ExcelPackage()) 
     { 
      var name = this.GetSelectedViewComboBoxItemName; 

      excelPackage.Workbook.Properties.Company = "COMPANYNAME"; 
      excelPackage.Workbook.Properties.Author = Configuration.UserName; 
      excelPackage.Workbook.Properties.Title = string.Concat("Export for ", name); 
      excelPackage.Workbook.Properties.Category = "CATEGORY"; 

      var worksheet = excelPackage.Workbook.Worksheets.Add(name); 

      worksheet.Cells["A1"].LoadFromCollection(list, true, TableStyles.Medium2); 
      ExcelSheetFormatter.FormatWorksheet(worksheet, list); 

      var fileName = this.GetSelectedViewComboBoxItemName; 

      var fileDestination = DataExportHelper.ShowSaveFileDialog(fileName, false); 

      if (fileDestination == null) return; 

      try 
      { 
       excelPackage.SaveAs(fileDestination); 
      } 
      catch (InvalidOperationException) 
      { 
       throw new PulseException(ExceptionMessage.FileInUse, false); 
      } 

      DataExportHelper.OpenExportedFileDialog(fileDestination.FullName); 
     } 
    } 

Я использую EPPlus 4.0 Beta 2 (epplus.codeplex.com/releases/view/118053) в экспортируйте данные в Excel.

Поэтому я привязанными к API из EPPlus, которая:

public ExcelRangeBase LoadFromCollection<T>(IEnumerable<T> Collection, ...); 
+1

Может вы сделали 'GenericExport' не родовое, а? 'private void Export (IEnumerable items)' – LostInComputer

+0

Имеет ли код в GenericExport 'отличается от типа к типу? – Dennis

+0

@LostInComputer: Я использую EPPlus 4.0 Beta 2 (http://epplus.codeplex.com/releases/view/118053), чтобы экспортировать данные в excel. EEPlus ожидает и IEnumerable Коллекция. Подпись метода является общедоступной. ExcelRangeBase LoadFromCollection (IEnumerable Collection). – Joel

ответ

1

Если вы не можете изменить GenericExport подпись, то, боюсь, отражение твой единственный друг. Предполагая, что itemsimplementIList, содержит элементы одного и того же типа, и он не пуст:

// make IEnumerable<YourType> 
var itemType = items[0].GetType(); 
var castDef = typeof(Enumerable).GetMethod("Cast"); 
var cast = castDef.MakeGenericMethod(itemType); 
var enumerable = cast.Invoke(null, new[] { items }); 

// call GenericExport<YourType> 
var methodDef = typeof(Program).GetMethod("GenericExport", BindingFlags.Instance | BindingFlags.NonPublic); 
var method = methodDef.MakeGenericMethod(itemType); 

method.Invoke(this, new[] { enumerable }); 
+0

Наверное, я вас неправильно понял. Я могу изменить метод GenericExport, но я не могу изменить LoadFromCollection, используемый в методе GenericExport. Методы LoadFromCollection принимают значение IEnumerable . – Joel

+0

@Joel: «но я не могу изменить LoadFromCollection» - следовательно, вы не можете изменить «GenericExport», потому что в конечном итоге вам нужно вызвать какой-либо общий метод, ваш собственный или сторонний. – Dennis

+0

хорошо, что вы правы – Joel

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

  • Нет связанных вопросов^_^