【问题标题】:c# Save DataGridView to Xml filec# 将DataGridView保存到Xml文件
【发布时间】:2017-08-20 13:44:42
【问题描述】:

这是我保存文件的按钮:

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:对象引用未设置为对象实例。

我的网格视图看起来像: 身份证名称 1 迈克尔 2 菜鸟

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

【问题讨论】:

  • 您只写了一个数据集表。尝试编写整个数据集。所以使用 ds.WriteXml(sfd.filename);

标签: c# xml datagridview save


【解决方案1】:

在我看来,你的问题并不在你认为的地方。

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

对我来说,您的意思是在启动应用程序时收到消息,而不是在单击按钮时收到消息。如果您在单击之前收到错误,那么您的问题在其他地方,而不是在您发布的代码 sn-p 中。这是您当前正在执行的操作的完整且可测试的 sn-p。

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);
                }
            }
        }
    }
}

【讨论】:

  • 有效。谢谢!
【解决方案2】:

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

结果将如下所示:

<Data>
  <Bank>
    <BLZ>10000001</BLZ>
    <Test_1>server.bank.com</Test_1>
    <Test_2>V3.0</Test_2>
    <PIN_TAN_Test_URL>https://test.bank.com/</PIN_TAN_Test_URL>
  </Bank>
  ....
  <Bank>
    <BLZ>12396123</BLZ>
    <HBCI_Zugang_DNS>test01.test.com</HBCI_Zugang_DNS>
    <HBCI_Version>V3.0</HBCI_Version>
    <PIN_TAN_Test_URL>https://test11.test.com</PIN_TAN_Test_URL>
  </Bank>
</Data>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2014-11-20
    相关资源
    最近更新 更多