Экспорт Datagrid в XML
Пожалуйста, помогите мне экспортировать DataGrid в XML. Я пробовал два способа, но оба вызывают исключения.
DataTable dt = (DataTable)dataGrid2.DataSource;
dt.WriteXml("t.xml", XmlWriteMode.IgnoreSchema);
Это вызывает InvalidOperationException с сообщением «Невозможно сериализовать DataTable. Имя DataTable не задано».
Пожалуйста, порекомендуйте подходящий метод для экспорта таблицы данных в XML.
Ответов (2)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();
}
}
}