2012-03-01 91 views
1

我有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

回答

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事件創建一個處理程序。

相關問題