我一直在尝试读取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窗体上的保存按钮并调用子窗体的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();
}那么,你能让我知道我做错了什么吗?
发布于 2011-11-28 05:33:03
在调用writeX时,ds尚未实例化。有了提供的代码,就不可能知道为什么会这样。
你很可能在不同的作用域中声明了两个ds。
编辑:鉴于更新后的示例表明这不是ds作用域的问题,接下来要关注的是Form2对象的生存期。当NullReferenceException发生时,可能有两个不同的实例正在使用。也就是说,第二个实例可能已经创建但从未显示,Load事件从未触发,ds从未实例化。
编辑:现在很明显了。您在saveToolStripMenuItem_Click中使用的Form2与在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();
}https://stackoverflow.com/questions/8289092
复制相似问题