首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MDIForms: WriteXml :空引用异常

MDIForms: WriteXml :空引用异常
EN

Stack Overflow用户
提问于 2011-11-28 05:15:15
回答 1查看 244关注 0票数 0

我一直在尝试读取xml并将其打印到datagrid中,然后再次单击保存,将其写回相同的文件,以便在一段时间后打开它时,可以获得新文件。所以,这是我所做的:

代码语言:javascript
复制
  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方法时编写了一个事件。

代码语言:javascript
复制
public void writeX()
{
    MessageBox.Show("I'm in writeX()");

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

在这里,在WriteXml步骤中,我得到并错误地说

代码语言:javascript
复制
   Null Reference Exception : Object reference not set to an instance of an object.

父窗体代码

代码语言:javascript
复制
    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();
    }

那么,你能让我知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-28 05:33:03

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

你很可能在不同的作用域中声明了两个ds

编辑:鉴于更新后的示例表明这不是ds作用域的问题,接下来要关注的是Form2对象的生存期。当NullReferenceException发生时,可能有两个不同的实例正在使用。也就是说,第二个实例可能已经创建但从未显示,Load事件从未触发,ds从未实例化。

编辑:现在很明显了。您在saveToolStripMenuItem_Click中使用的Form2与在customer_clicked中使用的不同。

您将需要一个类级别的Form2实例。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8289092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档