Экспорт Datagrid в XML

Пожалуйста, помогите мне экспортировать DataGrid в XML. Я пробовал два способа, но оба вызывают исключения.

DataTable dt = (DataTable)dataGrid2.DataSource;
dt.WriteXml("t.xml", XmlWriteMode.IgnoreSchema);

Это вызывает InvalidOperationException с сообщением «Невозможно сериализовать DataTable. Имя DataTable не задано».

Пожалуйста, порекомендуйте подходящий метод для экспорта таблицы данных в XML.

Ответов (2)

Этот ответ специфичен для winforms на C#, но должен применяться в целом к ​​программированию ASP.NET. Ниже _dtResults - это глобальная таблица данных. Где-то раньше, когда вы привязываете источник datagrid (dg) к DataTable, просто сделайте копию в глобальную переменную _dtResults. Тогда звони ExportXMLFromDG() .

    // user clicks on button, which binds the dg to the datatable,
    // prompts the user to save the XML, serializes it and saves the file.
    private void toolStripButton4_Click(object sender, EventArgs e)
    {
        dg.DataSource = dtResults; // this actually happens earlier.
        _dtResults = dtResults; // this actually happens earlier.

        if (dg.Columns.Count > 0)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                ExportXMLFromDG(saveFileDialog1.FileName);
            }
        }
    }


    private void ExportXMLFromDG(string xml_file)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
        TextWriter textWriter = new StreamWriter(xml_file);
        serializer.Serialize(textWriter, _dtResults);
        textWriter.Close();

    }

Учитывая эту ошибку; просто установить имя DataTable?

dt.TableName = "Fred";
...

Лично я бы использовал сериализацию объектов (возможно, XmlSerializer закончился List<T> ), но все DataTable должно быть в порядке ...


Обновлять; например, используя DataTable.WriteXml / ReadXml ; обратите внимание на комментарий «ЭТА СТРОКА РАБОТАЕТ»; это необходимо: а: иметь возможность писать и б: правильно читать строки.

using System;
using System.Data;
static class Program
{
    static void Main()
    {
        DataTable table = CreateEmptyTable();
        table.Rows.Add(1, "abc");
        table.Rows.Add(2, "def");
        WriteTable(table);
        table.WriteXml("t.xml", XmlWriteMode.IgnoreSchema);

        DataTable clone = CreateEmptyTable();        
        clone.ReadXml("t.xml");
        WriteTable(clone);
    }
    static DataTable CreateEmptyTable()
    {
        DataTable table = new DataTable();
        table.Columns.Add("Foo", typeof(int));
        table.Columns.Add("Bar", typeof(string));
        table.TableName = "MyTable"; // THIS LINE MAKES IT ALL WORK
        return table;
    }
    static void WriteTable(DataTable table) {
        foreach (DataColumn col in table.Columns)
        {
            Console.Write(col.ColumnName);
            Console.Write('\t');
        }
        Console.WriteLine();
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                Console.Write(row[col]);
                Console.Write('\t');
            }
            Console.WriteLine();
        }
    }
}