Как добавлять информацию в xml-файл

367
06 мая 2017, 18:50

Есть вот такая база данных. Добавляю несколько полей в DGV, а потом мне нужно в обработчике событие(Import in XML) все те данные что были в DGV импортировать в XML файл.Код сериализации вставлял в кнопку Add, но тогда в XML сохранить мог только одну запись,ту которую добавлял первую. А мне надо сначал добавить несколько в грид, а тогда все в XML.

////кнопка add
private void button1_Click(object sender, EventArgs e)
{
    Form2 friendForm = new Form2();
    DialogResult result = friendForm.ShowDialog(this);
    if (result == DialogResult.Cancel)
        return;
    friends friends = new friends();
    friends.FirstName = friendForm.textBox1.Text;
    friends.LastName = friendForm.textBox2.Text;
    friends.Age = (int)friendForm.numericUpDown1.Value;
    friends.Number = friendForm.textBox3.Text;
    friends.House = (int)friendForm.numericUpDown2.Value;
    friends.Adress = friendForm.textBox4.Text;
    db.friendsSet.Add(friends);
    db.SaveChanges();
    XmlSerializer serial = new XmlSerializer(typeof(friends));
    using (FileStream fs = new FileStream(Environment.CurrentDirectory +
        "\\book.xml", FileMode.Create, FileAccess.Write))
    {
        serial.Serialize(fs, friends);
        MessageBox.Show("XML was created");
    }
}
Answer 1

Для начала, следует подумать: а нужно ли дублировать данные в xml-файл, если они уже сохранены в БД? База данных для того и предназначена, чтобы данные можно было легко добавлять, удалять, изменять, искать. Если для каких-то целей всё же понадобятся данные в формате xml, то их всегда можно получить прямо из БД. Одна из возможностей - команда FOR XML.

Ответ непосредстенно на ваш вопрос. Заведите список объектов Friend (переименуйте класс, Visual Studio автоматически сделает изменения во всём проекте).

List<Friend> _friends = new List<Friend>();

Это должно быть поле той формы, где выполняется сериализация.

Получив очередной экземпляр этого класса, добавляйте его в эту коллекцию:

Friend friend = new Friend();
friend.FirstName = friendForm.textBox1.Text;
...
db.friendsSet.Add(friend);
db.SaveChanges();
_friends.Add(friend); // добавляем в список

Когда ввод всех данных будет закончен, сериализуем весь список:

XmlSerializer serial = new XmlSerializer(typeof(List<Friend>)); // <--
using (FileStream fs = new FileStream(Environment.CurrentDirectory +
    "\\book.xml", FileMode.Create, FileAccess.Write))
{
    serial.Serialize(fs, _friends); // <--
    MessageBox.Show("XML was created");
}

Судя по скриншоту, этот код следует поместить в обработчик кнопки "Export". Кстати, вызов db.SaveChanges(); я бы перенёс туда же.

Обратите внимание: сериализатор должен быть создан соответствующего типа; на вход ему подаём не один экземпляр, а коллекцию.

Десериализовать, соответственно, нужно коллекцию, выполняя приведение к List<Friend>.

READ ALSO
Как использовать LINQ для заполнения List

Как использовать LINQ для заполнения List

Здравствуйте! Подскажите пожалуйста, как переписать функцию GetValues() с помощью LINQИ если дадите дельную ссылку на изучение LINQ(кроме MSDN), буду...

310
Как передать в Task параметр

Как передать в Task параметр

Вопрос как передать в класс Task или Task функцию с параметром, интересуют все способыСпасибо

441
Linq и большая база данных Count

Linq и большая база данных Count

Не могe решить проблему с подсчетом размера коллекцииЕсть таблица на сайте с фильтрами, там выводиться 10 записей

266
Ссылка на партнёра

Ссылка на партнёра

Имеется плагин, который парсит записи с сайта-партнёра, и сохраняет эти записи в новом произвольном типе, допустим custom_type

348