将datagridview保存到xml中

问题描述:

我有1个表单,其中button1 draw table at datagridview。 填充单元格后,我需要将数据从datagridview保存到xml通过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); 
       } 

      } 

,但我收到的错误:

object reference not set to an instantce of an object.

所以,我怎么能保存的datagridview到XML?

+1

你能告诉我们你把数据源设置到datagridview的代码吗? – 2012-03-01 11:13:29

+0

显然没有绑定到datagridview控件的DataSource。你如何使用这个数据网格?有更多的代码会很好.. – 2012-03-01 11:13:45

我希望你的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事件创建一个处理程序。