MDIForms:WriteXml:空引用异常

时间:2011-11-27 21:15:15

标签: c# mdi

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

  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();
    }

那么,请你知道我一直在做的错误吗?

1 个答案:

答案 0 :(得分:0)

当您呼叫writeX时,ds尚未实例化。使用提供的代码,无法分辨为什么会出现这种情况。

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

编辑:鉴于更新的示例显示它不是ds范围的问题,接下来要查找的是Form2对象的生命周期。发生NullReferenceException时,可能会使用两个不同的实例。也就是说,第二个实例可能已创建但从未显示过,Load事件从未触发,ds永远不会被实例化。

编辑:现在很明显了。您在Form2 saveToolStripMenuItem_Click中未使用与customer_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(); } 实例。

{{1}}