2017-06-15 74 views
0

我有一个表单,第一个问题是,人员是否想回答这些问题?如果它等于“否”,则隐藏其他输入。当我隐藏输入时,我想擦除这些字段,以便它们是空白的。WinForms - 清除ComboBox.SelectedIndex导致错误

当我隐藏我的组合框和使用:calledUs.SelectedIndex = -1;它返回一个错误说

对象引用不设置到对象

的一个实例,但它做什么,我希望它,只是带有错误。

我错过了什么来克服空引用?我一直在阅读下面的堆栈溢出问题:

Combobox text when clearing items

What is a NullReferenceException, and how do I fix it?

任何帮助将是巨大的。

UPDATE:

代码示例:

private void wantToAnswer_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (wantToAnswer.SelectedItem.ToString() == "Yes") 
      { 
       //THIS IS THE PANEL THE COMBOBOX IS WITHIN 
       clothingCaughtFire.Visible = true; 
       Refresh(); 
      } 
      else 
      { 
       calledUs.SelectedIndex = -1; 
       //THIS IS THE PANEL THE COMBOBOX IS WITHIN 
       clothingCaughtFire.Visible = false; 
       Refresh(); 
      } 
     } 
+3

您是否在构造函数中使用'calledUs.SelectIndex = -1;'?如果是这样,你是否在使用'InitializeComponent();'之前或之后使用? – Nathangrad

+0

或者你有一个SelectedIndexChanged事件处理程序?该例外来自该代码。 – Steve

+0

在使用'SelectedIndex'语句之前,我使用'InitializeComponent();'。 –

回答

1

一个快速的修正,我建议在条件加入?

... 

    // ?. instead of . : 
    // in case wantToAnswer.SelectedItem == null the condition now is null == "Yes" 
    if (wantToAnswer.SelectedItem?.ToString() == "Yes") 

    ... 

由于wantToAnswer.SelectedItem能够很好地null在这种情况下wantToAnswer.SelectedItem.ToString()会抛出异常NullReferenceException

在Ad与此相关。问题进一步下降了,我正在检查被叫单元Combobox。如下所示:

private void wantToAnswer_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     if (wanttoAnswer.SelectedItem?.ToString() == "Yes") 
     { 
      clothingCaughtFire.Visible = true; 
      Refresh(); 
     } 
     else 
     { 
      calledUs.SelectedIndex = -1; 
      clothingCaughtFire.Visible = false; 
      Refresh(); 
     } 
    } 

    private void calledUs_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (calledUs.SelectedItem?.ToString() == "Yes - Other") 
     { 
      otherClothingFire.Visible = true; 
      Refresh(); 

     } 
     else 
     { 
      otherClothingFire.Visible = false; 
      otherSpecify.Text = ""; 
      Refresh(); 
     } 
    } 
+0

这不会是我设置为“SelectedIndex = -1”的组合框'。如果我们隐藏其他元素,这是推动决策的组合框。在这种情况下不会是空的。这仍然需要吗? –

0

即错误表示calledUs对象是在时间零。确保在设置所选索引之前对象已被实例化。

0

把你的代码的InitializeComponent(), 之后,或者在的Form_Load()在您的控制需要被序初始化访问

+0

是的,这可能会减少发生问题的可能性,但它不会解决问题。如果在任何时候'calledUs'都是空的,你仍然会得到异常。 – Gareth

+0

是的,你是对的,是否有可能控制可以为空即使初始化我不认为控制将成为空,除非我们手动更新 –

1

由于您试图设置一个空对象的属性,因此出现错误。

考虑以下

Dog rex; 
rex.Colour = "Brown"; 

你不能设置雷克斯的颜色,直到你实例化他。例如,

Dog rex = new Dog(); 
rex.Colour = "Brown"; 

试图做到这一点calledUs.SelectedIndex = -1是同样的事情。在calledUs实例化之前,您无法访问其SelectedIndex

您可以在访问它之前检查它是否存在,以避免发生这种情况。例如,

if (calledUs != null) // Do what you need to do