我一直在尝试读取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();
}
那么,请你知道我一直在做的错误吗?
答案 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}}