сохранить новые строки в наборе данных обратно в XML - PullRequest
0 голосов
/ 14 декабря 2011

Не могу понять, что еще мне нужно сделать, чтобы сделать эту работу. Я пытаюсь добавить больше строк в мой набор данных и представление данных, а затем вывести одну из них в xml В идеале я хочу сохранить значения в наборе данных, затем связать datagridview и при закрытии формы вывести набор данных в файл XML. Но по какой-то причине это не работает. Он обновляет изменения в текущих строках, но не добавляет новые.

    public void LoadSongInfo(string filename)
    {
        TagLib.File tagFile = TagLib.File.Create(filename);
        string artist = tagFile.Tag.FirstAlbumArtist;
        string album = tagFile.Tag.Album;
        string title = tagFile.Tag.Title;

        DataRow newtrack = dsStore.Tables["Track"].NewRow();

        newtrack["Id"] = "5";
        newtrack["Artist"] = artist;
        newtrack["Album"] = album;
        newtrack["Filepath"] = filename;
        newtrack["Title"] = title;
        dsStore.Tables["Track"].Rows.Add(newtrack);
        dsStore.Tables["Track"].AcceptChanges();


        dataGridView1.DataMember = "Track";
        dataGridView1.DataSource = dsStore;
    }

    private void mediaplayer_FormClosing(object sender, FormClosingEventArgs e)
    {
        string path = "..//..//..//temp.xml";
        dataGridView1.EndEdit();
        if (dsStore.GetChanges() != null)
        {
            dsStore.WriteXml(path);
        }
    }

Я заметил, что

dsStore.GetChanges() 

возвращает ноль, если ячейка не была отредактирована. Поэтому я попытался удалить это заявление if, но все равно ничего.

РЕДАКТИРОВАТЬ: я пытался записать в пустой XML-файл, чтобы увидеть, если он пишет, по крайней мере, что-то, и без ошибок он проходит, как будто все в порядке, тогда, когда я открываю test2.xml его пустое ничего не было написано. (

private void mediaplayer_FormClosing(object sender, FormClosingEventArgs e)
    {
        string path2 = "..//..//..//test2.xml";
        dsStore.WriteXml(path2);
    }

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

У вас есть строка:

dsStore.Tables["Track"].AcceptChanges();

Это обновит RowState до DataRowState.Unchanged для каждой строки в этой таблице. Вот почему

dsStore.GetChanges()

не возвращает никаких изменений.

Попробуйте удалить вызов AcceptChanges ().

1 голос
/ 14 декабря 2011

Попробуйте удалить

dataGridView1.EndEdit();

, который используется, если ячейка редактируется, поэтому из-за этой строки может быть вызван тот факт, что она работает только при редактировании ячейки.

0 голосов
/ 15 декабря 2011

Хорошо, я получил это на работу ..

Первая ошибка того, что я пытался записать в функцию LoadSong в WriteXml, но это невозможно сделать, потому что эта функция вызывается из цикла ForEach.

Затем я пошел в FormClosing и просто сделал это следующим образом:

private void mediaplayer_FormClosing(object sender, FormClosingEventArgs e)
{

     dsStore.WriteXml(path);

}

И, наконец, не уверен, если это необходимо, но я установил свой набор данных сверху так:

public DataSet dsStore = new DataSet();

добавил "public" на случай, если не сохранились значения .. Спасибо всем за помощь.

...