组合框选择更改时WPF C#NULL异常

时间:2011-08-23 15:42:45

标签: c# wpf combobox

这是选择更改事件:

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 个答案:

答案 0 :(得分:3)

我猜SelectedItemnull,因此你什么都没有打电话给ToString

考虑尝试这个:

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

但是,您的ComboBox是否有标识符?这可以让您避免使用as

进行不必要的转换
if (myComboBox.SelectedItem != null)
{
    SelectedUser = myComboBox.SelectedItem.ToString();
}

答案 1 :(得分:0)

一种可能性是sender可能不是ComboBox

在没有as检查的情况下使用null运算符的问题是,您获得NullReferenceException而不是InvalidCastException更合适

使用显式强制转换,例如((ComboBox)sender).SelectedItem.ToString();如果您确定senderComboBox;否则在使用前检查null

答案 2 :(得分:0)

当没有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。如果您的假设是错误的,例外情况会让您知道。

如果在没有选定项目的情况下调用事件处理程序,这将跳过您的代码。