C# MDIForms:WriteXml:Null引用异常
我一直在尝试读取xml并在datagrid中打印它,然后再次单击“保存”将其写回同一个文件,这样,如果我在某个时间后打开它,我就可以拥有新文件。这就是我所做的: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;
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
在您的示例中不是全局的;是班级级的。是的。。很抱歉这是真的,就班级水平而言