C# 在数据网格之间切换时使用空指针

C# 在数据网格之间切换时使用空指针,c#,wpf,datagrid,C#,Wpf,Datagrid,在我正在编写的程序中,wpf表单上有两个数据网格。一个包含宠物主人,另一个包含实际的宠物。当用户单击所有者时,pet数据网格将通过SQL数据库填充他们自己的宠物。当前选定的所有者ID将保存到变量中。当用户单击宠物时也会执行同样的操作,宠物ID会保存到一个变量中 现在,我遇到的问题是当主人的宠物被选中时。当单击其他所有者时,我会得到一个空指针异常,我不完全确定原因 下面是一些代码。它在PetDg_SelectionChanged方法上崩溃。任何帮助都将不胜感激。谢谢 public partial

在我正在编写的程序中,wpf表单上有两个数据网格。一个包含宠物主人,另一个包含实际的宠物。当用户单击所有者时,pet数据网格将通过SQL数据库填充他们自己的宠物。当前选定的所有者ID将保存到变量中。当用户单击宠物时也会执行同样的操作,宠物ID会保存到一个变量中

现在,我遇到的问题是当主人的宠物被选中时。当单击其他所有者时,我会得到一个空指针异常,我不完全确定原因

下面是一些代码。它在PetDg_SelectionChanged方法上崩溃。任何帮助都将不胜感激。谢谢

public partial class UpdateWindowNew : Window
{
    int currentOwnerPk;
    int currentPetPk;

    public UpdateWindowNew()
    {
        InitializeComponent();
    }

    public void Window_Loaded(object sender, RoutedEventArgs e)
    {
        string conString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
        string cmdString = "empty";

        using (SqlConnection con = new SqlConnection(conString))
        {
            cmdString = "Select * from Owner";
            SqlCommand query = new SqlCommand(cmdString, con);
            SqlDataAdapter gridAdapter = new SqlDataAdapter(query);
            DataTable dt = new DataTable("Owner");
            gridAdapter.Fill(dt);
            ownerDg.ItemsSource = dt.DefaultView;
        }
    }

    private void ownerDG_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        currentOwnerPk = (int)(ownerDg.SelectedItem as DataRowView).Row.ItemArray[0];
        OwnerFname.Text = (string)(ownerDg.SelectedItem as DataRowView).Row.ItemArray[1];
        OwnerLname.Text = (string)(ownerDg.SelectedItem as DataRowView).Row.ItemArray[2];

        showOwnedPets(currentOwnerPk);
    }

    private void PetDg_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        currentPetPk = (int)(PetDg.SelectedItem as DataRowView).Row.ItemArray[0];
    }

这非常简单,因为当您选择另一个所有者时,pet DataGrid get empty并触发此异常,您需要在PetDg_SelectionChanged事件处理程序中检查所选项的null值:

currentPetPk = PetDg.SelectedItem is DataRowView item ?
    (int)item.Row.ItemArray[0] : -1;

SelectedItem可能为空。您应该使用Null条件运算符“?”检查它

currentOwnerPk = (int)(ownerDg?.SelectedItem as DataRowView)?.Row.ItemArray[0] ?? -1;

非常感谢你!你的答案和哈米德·纳埃米的答案都很有效。非常感谢!你的回答和Peter Bruins一样有效。