Исключение WPF C # NULL при изменении выбора в выпадающем списке - PullRequest
0 голосов
/ 23 августа 2011

Это событие изменило выбор:

private void cbUsers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    SelectedUser = (sender as ComboBox).SelectedItem.ToString();
    GetUserInformation();
}

GetUserInformation просто выбирает пароль из базы данных. Пользователи удаляются из базы данных, а затем обновляет элементы ComboBox:

public void FillComboBox()
{
    cbUsers.ItemsSource = null;
    HProDataContext db = new HProDataContext();
    var _UserName = (from d in db.users select d.username).ToList();
    cbUsers.ItemsSource = _UserName;
}

HProDataContext db = new HProDataContext();

var _UserID = (from d in db.users where d.username == cbUsers.Text select d.id).SingleOrDefault();

user u = db.users.Single(p => p.id == _UserID);
db.users.DeleteOnSubmit(u);
db.SubmitChanges();
cbUsers.ItemsSource = null;
cbUsers.Text = null;
FillComboBox();

При использовании этого последнего метода выдает такую ​​ошибку:

Object reference not set to an instance of an object.

Ошибка в этой строке метода FillComboBox:

SelectedUser = (sender as ComboBox).SelectedItem.ToString();

Кто-нибудь имеет представление о том, что не так?

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Я предполагаю, что SelectedItem - это null, и поэтому вы звоните ToString на пустом месте.

Попробуйте попробовать это:

if ((sender as ComboBox).SelectedItem != null)
{
    SelectedUser = (sender as ComboBox).SelectedItem.ToString();
}

Однако, не 'Ваш ComboBox имеет идентификатор?Это может позволить вам воздерживаться от ненужных конверсий с as:

if (myComboBox.SelectedItem != null)
{
    SelectedUser = myComboBox.SelectedItem.ToString();
}
0 голосов
/ 23 августа 2011

Ваш обработчик событий, вероятно, вызывается, когда нет SelectedItem.

Я бы написал это так:

private void cbUsers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var usersComboBox = (ComboBox)sender;
    if (usersComboBox.SelectedItem == null) return;

    SelectedUser = usersComboBox.SelectedItem.ToString();
    GetUserInformation();
}

Здесь вы ожидаете, что отправитель всегда ComboBox,поэтому я бы использовал приведение вместо as.Исключение сообщит вам, если ваше предположение неверно.

Это просто пропустит ваш код, если обработчик события вызывается без выбранного элемента.

0 голосов
/ 23 августа 2011

Одна возможность состоит в том, что sender может не быть ComboBox.

Проблема использования оператора as без проверки null состоит в том, что вы получаете NullReferenceException вместо InvalidCastException, что более уместно

Вместо этого используйте явное приведение, например ((ComboBox)sender).SelectedItem.ToString();, если вы уверены, что sender - это ComboBox;в противном случае проверьте null перед использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...