这是选择更改事件:
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();
有没有人知道出了什么问题?
答案 0 :(得分:3)
我猜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();
}
答案 1 :(得分:0)
一种可能性是sender
可能不是ComboBox
。
在没有as
检查的情况下使用null
运算符的问题是,您获得NullReferenceException
而不是InvalidCastException
更合适
使用显式强制转换,例如((ComboBox)sender).SelectedItem.ToString();
如果您确定sender
是ComboBox
;否则在使用前检查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
。如果您的假设是错误的,例外情况会让您知道。
如果在没有选定项目的情况下调用事件处理程序,这将跳过您的代码。