这里有类似的问题,但没有一个适合我的特定情况。
我有一个带有按钮的Windows窗体。该按钮附加到事件处理程序,如下所示:
private void mybutton_Click(object sender, EventArgs e)
{
// do some processing here
}
此外还有一个组合框,其中选择的变化应该触发上面定义的按钮事件处理程序。
private void mycombobox_SelectedIndexChanged(object sender, EventArgs e)
{
mybutton_Click(sender, e); // this is the line which pops up the dialog
}
代码在运行时完全按预期工作,但我在编译时得到一个对话框提示符,其中显示:
对象引用未设置为对象的实例
没有其他错误或警告。
谷歌搜索告诉我,如果程序试图访问设置为null的引用类型变量的成员,则此消息是错误。
但是,当我在调试模式下运行此代码时,发送方和事件(e)变量都不为空。
那么为什么会出现这个对话框?
如果这是一个错误或警告 - 它应该显示为错误或警告但不会发生这种情况。
这是截图:
编辑:回答评论中提出的问题
屏幕截图中没有错误。
该程序运行良好 - 只需弹出
弹出窗口是由组合框mybutton_Click(sender, e);
函数中的行selectedIndexChanged
引起的。
mybutton_Click(sender, e)
在处理过程中不使用任何发送者或e参数。
我还没有安装任何VS扩展。
答案 0 :(得分:4)
在ComboBox的Click-event
中调用按钮的SelectedIndexChanged-event
并不是一个好的设计,这也可能是错误的原因。
最好把你的逻辑放在一个单独的方法中,并在Click-和SelectedIndexChanged事件中调用它,如下所示:
private void UpdateSomething()
{
// Do whatever you want
}
private void mybutton_Click(object sender, EventArgs e)
{
UpdateSomething();
}
private void mycombobox_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateSomething();
}
答案 1 :(得分:2)
我认为正在发生的事情是事件在设计模式下启动(我似乎记得在当天使用WinForms时我发生过几次)。
为了解决它,我所做的是处理表单加载事件,然后我将一个监听器附加到SelectedIndexChanged。然后在设计模式下,事件没有绑定并且不会触发,但在运行时它被绑定。
类似的东西:
public void form_OnLoaded(object sender, EventArgs e)
{
myComboBox.SelectedIndexChanged += mycombobox_SelectedIndexChanged;
}