Сохранить данные из 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 шт):

Автор решения: Andrew
  1. Создай метод который конвертирует твой обьект в массив стрингов в нужном порядке

  2. Возьми колекцию обьектов и циклом пройдись по ней

    2.1 конвертация обьекта в массив строк

    2.2 всунуть массив строк в обьект сохраняюзий цсв как строку

Использовать можно библиотеку взятую отсюда, она идеально подойдет под твои задачи:

Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы

для считывания делаешь то же самое, только в обратном порядке.

→ Ссылка