Сохранить данные из WPF DataGrid в CSV
Есть класс примерно такого содержания:
abstract class AbstractDataFile
{
public abstract string filePath { set; get; }
public abstract string fileName { get; }
public abstract long inOffset { get; }
public abstract long outOffset { get; }
public abstract string Type { get; }
public abstract DateTime FileDateTime { get; }
public abstract TimeSpan Duration { get; }
public abstract double? Temp{ get; }
public abstract uint? sourceId{ get; }
......
}
Ещё с кучей полей. В результате работы фабрики я получаю ObservableCollection которая привязана к datagrid :
ObservableCollection<AbstractDataFile> abstractFiles = new ObservableCollection<AbstractDataFile>();
dataGridView1.ItemsSource = abstractFiles;
Но при помещении в data grid экземпляров класса производных от AbstractDataFile я скрываю некоторые поля к примеру:
<DataGridTextColumn Header="File_Path" Binding="{Binding filePath}" IsReadOnly="True" **Visibility="Collapsed"**/>
Так как полный путь бывает длинным, да и пользователю путь не интересен. Но путь нужен при других манипуляциях типа копирования, удаления файлов и тд. Поэтому он как бы есть, но юзер его не видит. Также есть ещё несколько подобных полей чисто технического назначения.
Появилась задача сохранять всё что сделал пользователь с данными в datagridview в файл csv. пытаюсь это решить так:
for (int i = 0; i < dataGridView1.Items.Count; i++)
{
var item = dataGridView1.Items[i];
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
var column = dataGridView1.Columns[j];
var cell = column.GetCellContent(item);
Debug.WriteLine(cell);
}
}
cell - всегда null.
Или так:
foreach (var row in dataGridView1.Items)
{
foreach (var prop in row.GetType().GetProperties())
{
sw.Write(prop.GetValue(row, null)?.ToString() + ";");
}
}
В этом случае в файл попадают все скрытые поля, не сохраняется сортировка столбцов и тд. В любом из приведённых выше вариантов я получаю экземпляр класса производного от AbstractDataFile. Хотя мне нужно получить именно то, что видит пользователь на datagridview. Вариант с выделением всех ячеек datagrid и последующим копированием в буфер обмена не подходит. Как получить данные именно с datagridview, а не с объекта который к нему привязан? Для упрощения представим что все строки уже отрисованы.
Ответы (1 шт):
Создай метод который конвертирует твой обьект в массив стрингов в нужном порядке
Возьми колекцию обьектов и циклом пройдись по ней
2.1 конвертация обьекта в массив строк
2.2 всунуть массив строк в обьект сохраняюзий цсв как строку
Использовать можно библиотеку взятую отсюда, она идеально подойдет под твои задачи:
Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы
для считывания делаешь то же самое, только в обратном порядке.