У меня есть 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, ...);
Может вы сделали 'GenericExport' не родовое, а? 'private void Export (IEnumerable items)' – LostInComputer
Имеет ли код в GenericExport 'отличается от типа к типу? –
Dennis
@LostInComputer: Я использую EPPlus 4.0 Beta 2 (http://epplus.codeplex.com/releases/view/118053), чтобы экспортировать данные в excel. EEPlus ожидает и IEnumerable Коллекция. Подпись метода является общедоступной. ExcelRangeBase LoadFromCollection (IEnumerable Collection). –
Joel