将数据从datagridview保存到xml

时间:2012-03-01 11:10:54

标签: c# xml winforms datagridview

我有1个表单,其中 button1 datagridview 中绘制表格。 填充单元格后,我需要通过 button2 将数据从 datagridview 保存到xml。

//save
private void button1_Click(object sender, EventArgs e)
        {        
            try
            {                      
                DataSet ds = new DataSet();
                ds = (DataSet)(dataGridView1.DataSource);
                ds.WriteXml(@"c:\1.xml");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка: " + ex.Message);
            }            
        }

//draw a datagridview    
private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    int x, y;
                    x = Convert.ToInt32(textBox1.Text);
                    y = Convert.ToInt32(textBox2.Text);
                    double[,] grid;
                    grid = new double[x, y];
                    int k = 0;
                    k = dataGridView1.ColumnCount;
                    if (k != 0)
                        for (int i = 0; i < k; i++)
                            dataGridView1.Columns.RemoveAt(0);
                    dataGridView1.Columns.Clear();
                    AddColumns(y, dataGridView1);
                    AddRows(x, dataGridView1);
                    dataGridView1.RowHeadersWidth = 22;                                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка: " + ex.Message);
                }

            }

但我收到了错误:

  

对象引用未设置为对象的瞬时。

那么,如何将datagridview保存到xml?

1 个答案:

答案 0 :(得分:2)

我希望你的dgv没有有效的数据源。有关如何绑定数据源的信息,请参阅here。您是如何使用数据填充dgv的?

您可以尝试序列化,但DataGridView不可序列化,您需要遍历dgv(datagridview)并将每个项目添加到集合中。最好创建一个可以重复dgv数据的结构,并将其声明为[Serializable()]。每个字段都可以存储为字符串,因此只需遍历dgv,在每个项目上调用ToString()并将其添加到结构的实例中。遍历你的dgv行:

 for (int i = 0; i < dgv.Rows.Count; i++)
 {
      //add each row and item to your structure
 }

或者,如果您有数据源,则可以更直接地序列化。

所以现在你有一个可序列化的集合,它充满了你的所有数据。现在您需要序列化该结构,然后将其写入文件,如:

XmlSerializer izer = new XmlSerializer(YourStructure.GetType());
TextWriter WriteFileStream = new StreamWriter(@"c:\1.xml");
izer.Serialize(WriteFileStream, YourStructure);
WriteFileStream.Close();

我希望这有帮助,可以找到有关序列化的信息here。请记住,您可以通过双击设计视图中的按钮为按钮OnClick事件创建处理程序。