2011-11-27 92 views
0

我一直在嘗試讀取xml並將其打印在datagrid中,然後再次單擊save時將其寫回到同一個文件中,以便如果在某個時間後打開它,我可以使用新的文件。所以,這是我做的:MDIForms:WriteXml:空引用異常

DataSet ds; 
private void Form2_Load(object sender, EventArgs e) 
{ 
    cmd = new SqlCommand("getCustomers", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    da = new SqlDataAdapter(cmd); 
    ds = new DataSet(); 
    //da.Fill(ds, "Productslist"); 
    ds.ReadXml(@"C:\Users\Nishanth\documents\visual studio 
     2010\Projects\Ex1\Ex2\ShoppingCart1.ds"); 
    dataGridView1.DataSource = ds.Tables[0]; 
} 

所以,這裏我從xml中讀取併爲它分配一個網格。在接下來的幾行中,當我點擊父級mdi表單上的保存按鈕並調用子表單的writeX方法時,我寫了一個事件。

public void writeX() 
{ 
    MessageBox.Show("I'm in writeX()"); 

    ds.WriteXml(@"C:\Users\Nishanth\documents\visual studio   
     2010\Projects\Ex1\Ex2\ShoppingCart1.ds"); 
} 

這裏,在步中WriteXML,我得到和錯誤說

Null Reference Exception : Object reference not set to an instance of an object. 

父窗體代碼

private void customer_clicked(object sender, EventArgs e) 
    { 
     Form2 f2 = new Form2(); 
     f2.MdiParent = this; 

     f2.MaximizeBox = true; 

     f2.Show(); 
    } 

    private void products_clicked(object sender, EventArgs e) 
    { 

     Form1 f = new Form1(); 
     f.MdiParent = this; 

     f.MaximizeBox = true; 

     f.Show(); 



    } 

    private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form2 f2 = new Form2(); 
     f2.writeX(); 
    } 

因此,可以ü請讓我知道這個錯誤我一直在做?

回答

0

當時你打電話給writeXds還沒有被實例化。隨着代碼的提供,不可能說出爲什麼會這樣。

很有可能你有兩個ds在不同的範圍內聲明。

編輯:由於更新的例子表明,它不是ds的範圍的問題,尋找未來的事情是Form2對象的生命週期。當發生NullReferenceException時,可能有兩種不同的實例正在使用。也就是說,可能創建了第二個實例,但從未顯示過,Load事件從未觸發,並且從未實例化過。

編輯:現在很明顯。您在saveToolStripMenuItem_Click中不使用與customer_clicked中相同的Form2

您將需要一個類級別的Form2實例。

Form2 _form2; 
private void customer_clicked(object sender, EventArgs e) 
{ 
    _form2 = new Form2(); 
    _form2.MdiParent = this; 

    _form2.MaximizeBox = true; 

    _form2.Show(); 
} 

private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    // a NullReference is still possible if this is called before customer_clicked 
    _form2.writeX(); 
} 
+0

更新了代碼 – user838359

+0

可以讓我知道如何處理這個問題嗎? – user838359

+0

我實例化全局數據集。然後在form2_load中更新ds,然後編寫xml,它不寫任何內容(清除所有內容;猜測ds爲null)。 – user838359