C# 从WPF数据网格中删除行后出错
当我尝试从WPF Datagrid中删除选定行时,它会正确删除该行,但“dataGrid1\u SelectionChanged”事件引发一个异常,即对象引用未设置为对象的实例。删除行后,我无法处理这种情况C# 从WPF数据网格中删除行后出错,c#,.net,wpf,C#,.net,Wpf,当我尝试从WPF Datagrid中删除选定行时,它会正确删除该行,但“dataGrid1\u SelectionChanged”事件引发一个异常,即对象引用未设置为对象的实例。删除行后,我无法处理这种情况 private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) { OrignalSelectedRow = null; DataGrid gd
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;
是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";
}
删除该行后,将没有选定的行。这意味着
DataRowView rowSelected=dataGrid1.SelectedItem作为DataRowView
将为空,您无法访问它rowSelected[“b_id”]
。是的,您是对的,我也知道这是原因。但我不知道如何解决这个问题。我想解决这个错误,但不知道。添加一个简单的空检查。我添加了一个答案。请上传我的答案,因为否决票将阻止我提问。删除行后,还有其他行,我希望如果删除行,那么如果还有任何行,那么将自动选择左行。这也可以实现。当然,尝试在删除后设置一个新的选定行,如中所述,请向上投票我的问题,因为向下投票将导致我提出更多问题。