C# MDIForms:WriteXml:Null引用异常

C# MDIForms:WriteXml:Null引用异常,c#,mdi,C#,Mdi,我一直在尝试读取xml并在datagrid中打印它,然后再次单击“保存”将其写回同一个文件,这样,如果我在某个时间后打开它,我就可以拥有新文件。这就是我所做的: DataSet ds; private void Form2_Load(object sender, EventArgs e) { cmd = new SqlCommand("getCustomers", conn); cmd.CommandType = CommandType.StoredProcedure;

我一直在尝试读取xml并在datagrid中打印它,然后再次单击“保存”将其写回同一个文件,这样,如果我在某个时间后打开它,我就可以拥有新文件。这就是我所做的:

  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窗体上单击save按钮并调用子窗体的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();
    }

那么,您能告诉我我犯了什么错误吗?

在您调用
writeX
时,
ds
尚未实例化。有了提供的代码,就不可能知道为什么会这样

您很可能在不同的范围内声明了两个
d

编辑:更新后的示例表明这不是
ds
范围的问题,接下来要查找的是
Form2
对象的生存期。当发生NullReferenceException时,很可能使用了两个不同的实例。也就是说,可能创建了第二个实例,但从未显示,加载事件从未触发,
ds
从未实例化

编辑:现在很明显。您在
saveToolStripMenuItem\u Click
中使用的
Form2
与在
customer\u clicked
中使用的表单不同

您需要一个类级别的
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();
}

你能告诉我处理这个问题的方法吗?我全局实例化了数据集。然后在form2_load中更新ds,然后我编写不写入任何内容的xml(清除所有内容;猜测ds为空)。换句话说,您发布的代码可能并不重要——父表单中的
form2
实例的范围不重要。
ds
在您的示例中不是全局的;是班级级的。是的。。很抱歉这是真的,就班级水平而言