【问题标题】:How to write data from datagridview to XML如何将数据从 datagridview 写入 XML
【发布时间】:2017-12-07 13:50:14
【问题描述】:

我在datagridview中添加了很多空行,我想将数据写入xml。我做了一些小研究,但我很高兴你没有按照我想要的方式做。

DataTable dt = new DataTable();
dt.TableName = "SD";
dt = dataGridView1.DataSource as DataTable;
dt.WriteXml("SD.xml");

它不工作或我无法运行它。

它的错误信息:

System.NullReferenceException: '对象引用未设置为 对象的实例。'

【问题讨论】:

  • 你得到什么错误信息?
  • 我认为你的xml文件路径不正确。
  • 不,我更改了 xml 文件路径,但我不从 datagridview 导入数据
  • 我在DataGridView中输入了数据但是我无法读取它,所以我无法写入XML。
  • 这是错误消息:System.NullReferenceException: '对象引用未设置为对象的实例。'

标签: c# xml winforms datagridview


【解决方案1】:

您的dt 很可能在dt = dataGridView1.DataSource as DataTable; 中返回null,因此抛出System.NullReferenceException: 'Object reference not set to an instance of an object. 确保您的dataGridView1.DataSource 实际上可以转换为as DataTable

这是一个完整的 sn-p。

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace DataGridViewToXML_47696565
{
    public partial class Form1 : Form
    {

        DataTable dgvdt = new DataTable();
        DataGridView dgv = new DataGridView();
        Button btn = new Button();
        public Form1()
        {
            InitializeComponent();
            InitOurStuff();
        }

        private void InitOurStuff()
        {
            this.Controls.Add(dgv);
            dgv.DataSource = dgvdt;
            dgv.Dock = DockStyle.Top;

            dgvdt.TableName = "SD";
            dgvdt.Columns.Add();
            for (int i = 0; i < 10; i++)
            {
                dgvdt.Rows.Add($"row {i}");
            }

            this.Controls.Add(btn);
            btn.Location = new Point(5, dgv.Location.Y + dgv.Height + 5);
            btn.Text = "Click me";
            btn.Click += Btn_Click;

        }

        private void Btn_Click(object sender, EventArgs e)
        {
            dgvdt.WriteXml(@"c:\temp\mydtxml.xml");
        }
    }
}

这是另一个 sn-p,其中我的 DataSource 还不是 DataTable。

using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace DataGridViewToXML_47696565
{
    public partial class Form2 : Form
    {
        BindingList<dgventry> dgvdata = new BindingList<dgventry>();
        DataGridView dgv = new DataGridView();
        Button btn = new Button();


        public Form2()
        {
            InitializeComponent();
            initOurStuff();
        }

        private void initOurStuff()
        {
            dgv.Dock = DockStyle.Top;
            dgv.DataSource = dgvdata;
            this.Controls.Add(dgv);

            for (int i = 0; i < 10; i++)
            {
                dgvdata.Add(new dgventry { col1 = $"col1 row{i}", col2 = $"col2 row{i}", col3 = $"col3 row{i}" });
            }

            this.Controls.Add(btn);
            btn.Location = new Point(5, dgv.Location.Y + dgv.Height + 5);
            btn.Text = "Click me";
            btn.Click += Btn_Click; ;
        }

        private void Btn_Click(object sender, EventArgs e)
        {


            /*The DataSource connected to the DGV is not already a DataTable,
             so I'll traverse the DataGridView and create my own DataTable out of it*/
            DataTable dt = new DataTable();//create the data table
            dt.TableName = "SD";//give it a name
            //create the appropriate number of columns
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                dt.Columns.Add(dgv.Columns[i].HeaderText);
            }

            //loop through each row of the DataGridView
            foreach (DataGridViewRow currentRow in dgv.Rows)
            {
                dt.Rows.Add();
                int runningCount = 0;
                //loop trough each column of the row
                foreach (DataGridViewCell item in currentRow.Cells)
                {
                    dt.Rows[dt.Rows.Count - 1][runningCount] = item.FormattedValue;
                    runningCount++;
                }
            }

            if (dt != null)
            {
                dt.WriteXml(@"c:\temp\mynewxml.xml");
            }

        }
    }


    public class dgventry
    {
        public string col1 { get; set; }
        public string col2 { get; set; }
        public string col3 { get; set; }
    }
}

这是另一个sn-p。在这一个中,DataGridView 开始为空。用户必须手动输入数据。

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace DataGridViewToXML_47696565
{
    public partial class Form3 : Form
    {

        DataGridView dgv = new DataGridView();
        Button btn = new Button();

        public Form3()
        {
            InitializeComponent();
            initOurStuff();
        }

        private void initOurStuff()
        {
            dgv.Dock = DockStyle.Top;
            this.Controls.Add(dgv);
            for (int i = 0; i < 10; i++)
            {
                DataGridViewColumn newcol = new DataGridViewTextBoxColumn();
                newcol.Name = $"col{i}";
                dgv.Columns.Add(newcol);
            }

            this.Controls.Add(btn);
            btn.Location = new Point(5, dgv.Location.Y + dgv.Height + 5);
            btn.Text = "Click me";
            btn.Click += Btn_Click; ;
        }

        private void Btn_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();//create the data table
            dt.TableName = "SD";//give it a name
            //create the appropriate number of columns
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                dt.Columns.Add(dgv.Columns[i].HeaderText);
            }

            //loop through each row of the DataGridView
            foreach (DataGridViewRow currentRow in dgv.Rows)
            {
                dt.Rows.Add();
                int runningCount = 0;
                //loop trough each column of the row
                foreach (DataGridViewCell item in currentRow.Cells)
                {
                    dt.Rows[dt.Rows.Count - 1][runningCount] = item.FormattedValue;
                    runningCount++;
                }
            }

            if (dt != null)
            {
                dt.WriteXml(@"c:\temp\mynewxml.xml");
            }
        }
    }
}

【讨论】:

  • 我的朋友感谢您的帮助,但我已经有一个 datagridview 这只在任何空白空间中添加行,这对我不起作用它的详细信息:我有 10 列的 datagridview,我可以添加空白行它。我可以在这些空白行中输入数据。但我无法从此 datagridview 中读取数据。我想从 datagridview 读取数据写入 XML 文件你明白吗?
  • 这两个 sn-ps 演示了如何创建 Datagridview、填充它以及如何以两种不同的方式将其导出为 XML。我坚信您的问题的答案就在那里。您没有向我们展示您是如何填充 DataGridView 的,因此我们在回答您时必须做出某些假设。
  • @DavidHayter,添加了第三个 sn-p。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多