c#将DataGridView保存到Xml文件

这是我保存文件的按钮:

private void metroButton12_Click(object sender, EventArgs e) // save { DataSet ds = (DataSet)dataGridView1.DataSource; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "XML|*.xml"; if (sfd.ShowDialog() == DialogResult.OK) { try { ds.Tables[0].WriteXml(sfd.FileName); } catch (Exception ex) { Console.WriteLine(ex); } } } 

我尝试将我的datagridview保护为XML,但是当我选择文件时没有什么好处。 当我启动控制台时,我看到:System.NullReferenceException:对象引用未设置为对象实例。

我的gridview看起来像:ID Name 1 Michale 2 Noob

我在这里做错了什么?我在网上看到很多东西但在stackoverflow和其他论坛中找不到任何解决方案。 请耐心等待新手们。 谢谢!

对我而言,你的问题听起来并不像你认为的那样。

当我启动控制台时,我看到:System.NullReferenceException:对象引用未设置为对象实例。

对我来说,暗示您在启动应用程序时收到消息,而不是在您单击按钮时收到消息。 如果您在单击之前收到错误,则问题出在其他地方,而不是在您发布的代码段中。 这是您目前正在做的完整且可测试的片段。

 using System; using System.Data; using System.Windows.Forms; namespace DataGridViewToXML_43053387 { public partial class Form1 : Form { //DataSet theDataSet; public Form1() { InitializeComponent(); InsertDgvIntoForm(); ExportDgvToXML(); } private void InsertDgvIntoForm() { //create a data set DataSet ds = new DataSet(); //create a data table for the data set DataTable dt = new DataTable(); //create some columns for the datatable DataColumn dc = new DataColumn("ItemName"); DataColumn dc2 = new DataColumn("ItemValue"); DataColumn dc3 = new DataColumn("Blah"); DataColumn dc4 = new DataColumn("Bleh"); //add the columns to the datatable dt.Columns.Add(dc); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); //create 5 rows of irrelevant information for (int i = 0; i < 5; i++) { DataRow dr = dt.NewRow(); dr["ItemName"] = "Item" + i + "Name"; dr["ItemValue"] = "Item" + i + "Value"; dr["Blah"] = "Item" + i + "Blah"; dr["Bleh"] = "Item" + i + "Bleh"; dt.Rows.Add(dr); } //add the datatable to the datasource ds.Tables.Add(dt); //just because it looks better on my screen dataGridView1.AutoSize = true; //make this data the datasource of our gridview dataGridView1.DataSource = ds.Tables[0]; } private void ExportDgvToXML() { DataTable dt = (DataTable)dataGridView1.DataSource; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "XML|*.xml"; if (sfd.ShowDialog() == DialogResult.OK) { try { dt.WriteXml(sfd.FileName); } catch (Exception ex) { Console.WriteLine(ex); } } } } } 

blaze_125回答没有帮助我所以我找到了这个解决方案:

 private void btnXML_Save_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.TableName = "Bank"; for (int i = 0; i < dataGridView1.Columns.Count; i++) { //if (dataGridView1.Columns[i].Visible) // Add's only Visible columns (if you need it) //{ string headerText = dataGridView1.Columns[i].HeaderText; headerText = Regex.Replace(headerText, "[-/, ]", "_"); DataColumn column = new DataColumn(headerText); dt.Columns.Add(column); //} } foreach (DataGridViewRow DataGVRow in dataGridView1.Rows) { DataRow dataRow = dt.NewRow(); // Add's only the columns that you want dataRow["BLZ"] = DataGVRow.Cells["BLZ"].Value; dataRow["Test_1"] = DataGVRow.Cells["Test 1"].Value; dataRow["Test_2"] = DataGVRow.Cells["Test-2"].Value; dataRow["PIN_TAN_Test_URL"] = DataGVRow.Cells["PIN/TAN-Test URL"].Value; dt.Rows.Add(dataRow); //dt.Columns.Add(); } DataSet ds = new DataSet(); ds.Tables.Add(dt); //Finally the save part: XmlTextWriter xmlSave = new XmlTextWriter(XML_Save_Path_Filename, Encoding.UTF8); xmlSave.Formatting = Formatting.Indented; ds.DataSetName = "Data"; ds.WriteXml(xmlSave); xmlSave.Close(); } 

结果将如下所示:

   10000001 server.bank.com V3.0 https://test.bank.com/  ....  12396123 test01.test.com V3.0 https://test11.test.com