1

I have a problem, probably you guys in this forum could help me.

Here is my problem:

I want to show the MessageBox that say there is no data in datagridview, you cannot delete it. I already can delete the data in the datagridview, but when the datagridview contains 0 data, and i click delete "button", it is error. The error is: Object reference not set to an instance of an object. NullReferenceException

Here is the code that pointed by the error: int rowNum = dataGridView1.CurrentRow.Index;

Here is the code:

private void Delete(object sender, EventArgs e)
{
    DataTable dt = (DataTable) dataGridView1.DataSource;
    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();
        }

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

            if (rowNum == 0)
            {
                bool rowIsEmpty = true;

                foreach (DataGridViewCell cell in dataGridView1.CurrentRow.Cells)
                {
                    if (cell.Value != null)
                    {
                        rowIsEmpty = false;
                        break;
                    }
                }

                if (rowIsEmpty)
                {
                    System.Media.SoundPlayer sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                    sounds.Play();
                    MessageBox.Show("Tidak ada Data di Baris ini!", "Error");
                }
                else
                {
                    Delete(sender, e);
                }
            }
        }
    }
}

Does anyone knows how to fix it?

4

3 に答える 3

1

このように試してください dt.Rows.count > 0 は、データ テーブルにデータがない場合、データ テーブルにデータがあることを意味します。データが存在する場合は、操作を実行できます。dt.Rows.count は、データ テーブルの行数を示します

于 2013-09-14T16:18:48.340 に答える
0

次の条件が非常に役立つことがわかりました

if(dataGridView1.DataSource!=null)
{
    // do something
}
于 2016-04-27T10:38:53.290 に答える
0

DataGridView.CurrentRowを設定した場合のみ使用DataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelectできます。それ以外の場合は、次の方法で現在の行を取得する必要があります。

int rowNum = dataGridView1.CurrentCellAddress.Y;
var currentRow = dataGridView1.Rows[rowNum];

アップデート

DataTableのDataSource としてを使用しているようです。 inを利用dataGridView1する必要があります。このコードは、実際には 2 つのフェーズでデータを更新する現在のコードを変更しただけです。 1. DataTable と DataGridView から行を削除します。 2. データベースの実際の行を削除します。AdapterADO.NET

    private void Delete(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)dataGridView1.DataSource;
        int rowNum = dataGridView1.CurrentCellAddress.Y;
        if(rowNum == -1) {
           MessageBox.Show("There is no row selected!");
           return;
        }
        int id = Convert.ToInt32(dt.DefaultView[rowNum]["ID"]);
        //check if row is empty, simply return
        if(IsRowEmpty(rowNum)){
          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;
        }
        //Remove the row
        dt.DefaultView[rowNum].Delete();
        dt.AcceptChanges(); //<-- Because you don't use Adapter, call this to restore the row state.
        //Remove the underlying row in database
        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();
            }

            if (choice.comboBox1.Text == "English")
            {
                System.Media.SoundPlayer sound = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                sound.Play();
                MessageBox.Show("Deleted Successfully!", "Deleted");                    
            }
         }
    }
    //method to check if a row is empty
    private bool IsRowEmpty(int index){
       return dataGridView1.Rows[index].Cells.OfType<DataGridViewCell>()
                                       .All(c=>c.Value == null);
    }
于 2013-09-14T14:29:49.030 に答える