2011-11-27 90 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