Как я могу экспортировать DataGrid в XML в приложении WPF? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть DataGrid с именем GokartDataGrid. В нем есть несколько столбцов и строк, и я хотел бы экспортировать таблицу в файл XML, но метод, который я нашел, дал мне исключение. Мой код выглядит так, и он говорит System.InvalidCastException в экземпляре DataTable.

private void Xml_export() 
{
    DataTable dt = (DataTable)GokartDataGrid.ItemsSource;
    SaveFileDialog savefile = new SaveFileDialog();
    savefile.Filter = "XML |*.xml";
    savefile.ShowDialog();
    savefile.CheckFileExists = true;
    savefile.CheckPathExists = true;
    dt.WriteXml(savefile.FileName);         
}

Я сделаю секцию try-catch после того, как она заработает, но сейчас я не знаю, что мне делать.
Что я должен сделать, чтобы это работало? Итак, вот загрузка таблицы данных.

    public void DataGridUpload(string filepath)
    {
        if (filepath != null) 
        { 
        Gokart_container minden = new Gokart_container(filepath);
        GokartDataGrid.ItemsSource = minden.GetGokartlist();
        }
    }

Gokart_container содержит объекты Gokart в списке, а объект Gokart содержит несколько данных, например, лучшее время круга и все круги в другом списке. И некоторые строки, как имя гонщика.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я точно не знаю, что это такое, но эта ошибка говорит о том, что у вас нет источника данных в качестве источника элементов.
Что вдвойне верно.

Ваш ItemsSource не может быть датированным.
Если я пытаюсь установить источник данных для сетки данных равным единице, я получаю сообщение об ошибке:

Невозможно неявно преобразовать тип «System.Data.DataTable» в «System.Collections.IEnumerable». Существует явное преобразование (вам не хватает приведения?)

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

dg.ItemsSource = dt.DefaultView;

Если я тогда сделаю gettype, чтобы проверить, что это такое:

Type isType = dg.ItemsSource.GetType();

Это DataView, а не набор данных.

Может быть, вы могли бы привести к dataview и работать с этим. Но, может быть, это не то, что у вас есть в любом случае.

Но вы говорите, что объекты Gokart в списке.
Что звучит как список.
Таким образом, вы могли бы привести к списку

Но приведение некоторых данных к исходному интерфейсу, когда вы дали сетке данных, что данные в первую очередь, - необычный способ работы.

Более привычно работать с wpf, используя MVVM.
Как это:
https://social.technet.microsoft.com/wiki/contents/articles/32164.wpf-mvvm-step-by-step-2.aspx

С MVVM у вас будет модель представления, которая сохраняет ссылку на коллекцию GoKart. Обычно это будет наблюдаемая коллекция, а не список. Наблюдаемая коллекция поднимает коллекцию, измененную, когда вы добавляете или удаляете полезный элемент И сетка данных теряет некоторую функциональность, если вы привязываетесь к списку.

Во всяком случае, таким образом, у вас будет ссылка на сбор данных, и вы сможете работать с этим напрямую.
Как насчет XML из списка?
Зачастую это не единственное свойство, которое вы хотите сериализовать, а целая нагрузка.
Вы можете создать класс, имеющий одно свойство, List и заполнить его из вашей наблюдаемой коллекции, используя Linq и .ToList ().
Затем вы просто сериализуете этот класс и получаете все свои данные в формате xml.
Просто сделайте ваш класс общедоступным, свойства общедоступными и используйте datacontractserialiser.

Вот пример кода, который сериализуется на диск и десериализуется обратно:

    public static void SaveScenario(string fileURL, Scenario scenario)
    {
        scenario.ScenarioFile = fileURL;
        using (FileStream writer = new FileStream(fileURL, FileMode.Create))
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(Scenario));
            ser.WriteObject(writer, scenario);
        } 
    }
    public static Scenario ReadScenario(string fileURL)
    {
        FileStream fs = new FileStream(fileURL, FileMode.Open);
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        DataContractSerializer ser = new DataContractSerializer(typeof(Scenario));
        Scenario deserializedScenario = (Scenario)ser.ReadObject(reader, true);
        reader.Close();
        fs.Close();
        return deserializedScenario;
    }
}   
0 голосов
/ 05 мая 2018

datagrid.Columns может дать вам порядок заголовка столбца. И datagrid.Items.SourceCollection значений строк. И вы идете оттуда.

...