【问题标题】:Error after deletion of row from the WPF DataGrid从 WPF DataGrid 中删除行后出错
【发布时间】:2019-02-01 01:14:57
【问题描述】:

当我尝试从 WPF 数据网格中删除选定的行时,它会正确删除该行,但“dataGrid1_SelectionChanged”事件会引发异常,即对象引用未设置为对象的实例。在删除行后我无法处理这种情况。

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        OrignalSelectedRow = null;
        DataGrid gd = (DataGrid)sender;
       DataRowView rowSelected = dataGrid1.SelectedItem as DataRowView;

       int batchnumber = Convert.ToInt32(rowSelected["b_id"]); //This line is raising Exception
       //int batchnumber = batchidval;
       label16.Content = batchnumber;
    }

行删除代码在下方

 private void button6_Click(object sender, RoutedEventArgs e)
    {
        //Deletion of Row
        DataRowView rowSelected = dataGrid1.SelectedItem as DataRowView;
        int row_qty = Convert.ToInt32(rowSelected["qty"]);
        int row_batch_num = Convert.ToInt32(rowSelected["b_id"]);
        //label16.Content = row_batch_num;
        label16.Content = row_qty;
        con.Open();
        try
        {
            SqlCommand command = new SqlCommand("update batch set sold_qty=sold_qty-@qty2, left_qty=left_qty+@qty2 where id=@id2", con);
            command.Parameters.AddWithValue("@qty2", row_qty);
            command.Parameters.AddWithValue("@id2", row_batch_num);
            rexe = command.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            MessageBox.Show("Updation Error "+ex.ToString());
        }
        try
        {
            SqlCommand delcommand = new SqlCommand("DELETE FROM invoice WHERE sr#='" + rowSelected["sr#"] + "'", con);
            //con.Open();
            delcommand.ExecuteNonQuery();
            con.Close();

        }
        catch(Exception ex)
        {
            MessageBox.Show("Deletion Error " + ex.ToString());
        }
        if(rowSelected!=null)
        {
            dt_1.Rows.Remove(rowSelected.Row);   //dt_1 is a DataTable

        }
        dataGrid1.SelectedItem = 0;
    }

【问题讨论】:

  • 删除行后,将没有选中行。这意味着DataRowView rowSelected = dataGrid1.SelectedItem as DataRowView; 将为空,您无法访问它rowSelected["b_id"]
  • 是的,你是对的,我也知道这是原因。但我不知道如何解决这个问题。我想解决这个错误但不知道。
  • 添加一个简单的空检查。我已经添加了答案。
  • 请支持我的回答,因为否决票会阻止我提问。

标签: c# .net wpf


【解决方案1】:

删除行后,将没有选中的行。这意味着

DataRowView rowSelected = dataGrid1.SelectedItem as DataRowView;

null,你不能像这样访问它

rowSelected["b_id"]

一个简单的解决方案是检查 null 并在没有选择行的情况下设置默认值:

DataRowView rowSelected = dataGrid1.SelectedItem as DataRowView;
if (rowSelected != null)
{
    int batchnumber = Convert.ToInt32(rowSelected["b_id"]);
    label16.Content = batchnumber;
}
else
{
    label16.Content = "No row selected";
}

更紧凑一点:

if (dataGrid1.SelectedItem is DataRowView rowSelected)
{
    label16.Content = Convert.ToInt32(rowSelected["b_id"]);
}
else
{
    label16.Content = "No row selected";
} 

【讨论】:

  • 删除行后还有其他行,我希望如果行被删除,那么如果剩下任何行,则自动选择左行。这也能实现。
  • 当然,尝试在删除后设置一个新的选定行,如stackoverflow.com/questions/6265228/…所述
  • 请对我的问题投赞成票,因为投反对票会让我提出更多问题。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2012-05-20
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多