2013-03-06 2 views
1

Я новичок в инфраструктуре сущности. Теперь я пишу функцию удаления с помощью кнопки. Когда я нажимаю эту кнопку, мои данные будут удалены; однако он выведет предупреждение о том, что «Ссылка на объект не установлена ​​в экземпляр объекта». Я не могу понять этот вопрос.Ссылка на объект не установлена ​​в экземпляр объекта. (WPF Entityframework)

private void btnDelete_Click(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       if (UserDataGrid.SelectedItems.Count == 0) 
        return; 
       if (UserDataGrid.SelectedItems.Count > 0) 
        if (MessageBox.Show("Would you want to delete?", "Yes", MessageBoxButton.YesNo) == MessageBoxResult.Yes) 
        { 
         var selected = UserDataGrid.SelectedItem as User; 
         var index = selected.Index; 

         User user = new User(); 
         user = ssEntities.User.Where(x => x.Index == index).First(); 

         if (user != null) 
         { 
          ssEntities.User.DeleteObject(user); 
          ssEntities.SaveChanges(); 
         } 
        } 
      } 
      catch (Exception ex) 
      { MessageBox.Show(ex.Message); } 
      finally { } 
     } 

Если информации недостаточно, plz сообщите мне, чтобы добавить его.

+2

Какая линия, которая бросает исключение? – Freeman

+1

еще лучше, вы видите сообщение «Хотите удалить?» * Перед тем, как получить исключение? – RoelF

+0

без строки #, я бы предположил, что либо UserDataGrid имеет значение null, либо выбранный элемент является или не конвертируется в User – kenny

ответ

1

учитывая ваши комментарии, вот что вы должны сделать:

Так это выглядит, как весь ваших try-catch блок записывается следующим образом

try { } 
catch (Exception ex) 
{ MessageBox.Show(ex.Message); } 
finally { } 

вы не имеете ни малейшего понятия, где исключение возникающее, потому что вы теряете весь StackTrace. Вы должны изменить это поведение, поскольку с этим связано множество проблем. Найти все код-блоки, которые используют этот шаблон и изменить его на что-то вроде этого:

try { } 
catch (Exception ex) 
{ 
    Debug.WriteLine(string.Format("An exception has occurred in <some function>: {0}\n{1}", ex.Message, ex)); 
    MessageBox.Show(ex.Message); 
} 
finally { } 

Таким образом, вы сможете увидеть более детализированный вывод в окне отладки, и вы должны быть в состоянии найдите точное исключение, проверив StackTrace.
Вне курса, вместо использования Debug.WriteLine, вы также можете использовать другой механизм регистрации, например log4net.

+0

Спасибо за ваш ответ, но я проверил точку останова. Он не переходит в блок catch и даже не отображается в окне Debug. – CYB

+0

Но вы изменили * все * кодовых блоков, которые используют этот блок try-catch? Тот факт, что эта конкретная точка останова никогда не попадает, означает, что исключение происходит где-то в другом месте. – RoelF

+0

Эй, @Roel Спасибо за советы. Теперь я знаю, где я ошибаюсь. У меня просто избыточный столбец в моем datagrid, поэтому, когда я добавляю его или удаляю; это будет не так. – CYB