2009-02-27 98 views
1

请帮我将DataGrid导出为XML。 我尝试了两种方法,但都导致抛出异常。将Datagrid导出为xml

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

该投用消息一个InvalidOperationException“无法序列的数据表。数据表名称未设置。”

请推荐一种合适的方法将数据网格导出为XML。

+0

新增更新再评论 – 2009-02-27 07:27:04

回答

1

Here's a link以Marc的建议为例。

向下滚动到示例的SerializeToXML和DeserializeFromXML方法。

0

鉴于该错误;只需设置DataTable的名称?

dt.TableName = "Fred"; 
... 

就个人而言,我会使用对象序列化(或许XmlSerializer超过List<T>),但DataTable应该没事......


更新;例如使用DataTable.WriteXml/ReadXml;注意“这条线使它工作”评论;这是必要的a:能够写入,b:正确读取行。

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(); 
     } 
    } 
} 
+0

这是行不通的再次相同的错误 如何序列u能详细解释 – Arunachalam 2009-02-27 04:51:15

0

这个答案是特定于C#中的winforms,但一般应用于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(); 

    }