MDIForms: WriteXml: исключение нулевой ссылки - PullRequest
0 голосов
/ 28 ноября 2011

Я пытался прочитать 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();
    }

Итак, пожалуйста, дайте мне знать, какую ошибку я совершил?

1 Ответ

0 голосов
/ 28 ноября 2011

В то время, когда вы звоните writeX, ds не было создано. С предоставленным кодом невозможно сказать, почему это так.

Скорее всего, у вас есть два ds, объявленных в разных областях.

EDIT : Учитывая, что обновленный пример показывает, что это не проблема области действия 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();
}
...