你调用的对象是空的。的NullReferenceException

时间:2013-09-15 17:50:27

标签: c# winforms ms-access datagridview

我已经可以删除数据库,并且想要在所选行(datagridview)中没有数据时显示错误,但它只在用户没有输入任何数据时才会显示(或者datagridview仍然为空行)。

private void DeleteDatabase(object sender, EventArgs e)
{
    DataTable dt = (DataTable)dataGridView1.DataSource;

    if (dt.Rows.Count > 0)
    {
        int rowNum = dataGridView1.CurrentRow.Index;
        int id = Convert.ToInt32(dt.DefaultView[rowNum]["ID"]);
        dt.DefaultView[rowNum].Delete();

        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            string query = "DELETE FROM [Table] WHERE [ID] = @ID";
            conn.Open();

            using (OleDbCommand cmd = new OleDbCommand(query, conn))
            {
                cmd.Parameters.AddWithValue("@ID", id);
                cmd.ExecuteNonQuery();
            }

            conn.Close();
        }
    }

    else if (dt.Rows.Count <= 0)
    {
        if (choice.comboBox1.Text == "English")
        {
            System.Media.SoundPlayer sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
            sounds.Play();
            MessageBox.Show("There is no Data in the Selected Row!", "Error");
            return;
        }
    }

    if (choice.comboBox1.Text == "English")
    {
        System.Media.SoundPlayer sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
        sounds.Play();
        MessageBox.Show("Deleted Successfully!", "Deleted");
    }
}

用户输入数据时,将其删除。数据删除成功,但是当用户在用户删除数据后再次单击“删除”按钮时,会出现类似标题的错误。

以下是截图(我将3张截图混合成1张图片):

enter image description here

----屏幕截图1(左图)说明-----:

当我在上午12:38运行程序时,当我点击“删除”按钮时,它就像上面的屏幕截图(1)一样(注意:它是正确的)。

-----屏幕截图2(中间图像)的描述-----:

程序仍然在上午12:39处于活动状态,一切正常(数据已添加,“删除”功能运行,因为所选行中有数据)。

----屏幕截图3(右图)说明-----:

程序仍然在上午12:40处于活动状态,之前的数据(见截图2)已被删除,并且所选行再次为空,当我单击“删除”按钮时,消息框未显示为截图1,但它给出了同样的错误。 (这是我面临的问题)。

注意:抱歉图片尺寸较小。

问题是:为什么当用户没有输入任何数据时,There is no data in the selected row的消息框会在用户单击“删除”按钮时运行。但是当用户输入任何数据时(假设数据已经输入到第一行,并且选择将在第一行中为完整行)并单击“删除”按钮,它将删除所选行中的数据以及用户何时再次点击“删除”,它没有显示There is no data in the selected row的消息框,但它显示错误,如标题。

1 个答案:

答案 0 :(得分:1)

您不需要else if

尝试:

private void DeleteDatabase(object sender, EventArgs e)
{
    DataTable dt = (DataTable)dataGridView1.DataSource;

    if (dt.Rows.Count > 0)
    {
        int rowNum = dataGridView1.CurrentRow.Index;
        int id = Convert.ToInt32(dt.DefaultView[rowNum]["ID"]);
        dt.DefaultView[rowNum].Delete();

        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            string query = "DELETE FROM [Table] WHERE [ID] = @ID";
            conn.Open();

            using (OleDbCommand cmd = new OleDbCommand(query, conn))
            {
                cmd.Parameters.AddWithValue("@ID", id);
                cmd.ExecuteNonQuery();
            }

            conn.Close();
        }

        if (choice.comboBox1.Text == "English")
        { 
            System.Media.SoundPlayer sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
            sounds.Play();
            MessageBox.Show("Deleted Successfully!", "Deleted");
        }
    }
    else // count is 0
    {
        if (choice.comboBox1.Text == "English")
        {
            System.Media.SoundPlayer sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
            sounds.Play();
            MessageBox.Show("There is no Data in the Selected Row!", "Error");
            // return; (this return is redundant as we're at the end of the method.)
        }
    }
}

您的问题也可能是您致电DeleteDatabase()

的地方