【问题标题】:WinForms - Clearing ComboBox.SelectedIndex Causing ErrorWinForms - 清除 ComboBox.SelectedIndex 导致错误
【发布时间】:2017-06-15 17:57:13
【问题描述】:

我有一个表格,第一个问题是,这个人想回答这些问题吗?如果它等于“否”,则隐藏其他输入。当我隐藏输入时,我想删除这些字段,使它们为空白。

当我隐藏我的组合框并使用:calledUs.SelectedIndex = -1; 时,它会返回一个错误提示

对象引用未设置为对象的实例

但它做了我想要的,只是有一个错误。

我是否遗漏了一些东西来克服 Null 引用?我一直在阅读以下 Stack Overflow 问题:

Combobox text when clearing items

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

任何帮助都会很棒。

更新:

代码示例:

 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();
            }
        }

【问题讨论】:

  • 你在构造函数中使用calledUs.SelectedIndex = -1;吗?如果是这样,你是在使用之前还是之后使用InitializeComponent();
  • 或者您有 SelectedIndexChanged 事件处理程序吗?异常来自该代码。
  • 我在使用SelectedIndex 语句之前使用InitializeComponent();
  • wantToAnswer.SelectedItem 也可以是nullwantToAnswer.SelectedItem.ToString() 会抛出异常
  • @Gary Henshall:wantToAnswer.SelectedItem == null 是异常的可能原因; .SelectedItem?.toString() 不会破坏任何东西,这就是为什么值得一试

标签: c# winforms


【解决方案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 异常

除此之外。问题在我对被调用的Us 组合框进行检查的地方更进一步。见下文:

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();
        }
    }

【讨论】:

  • 这不是我设置为SelectedIndex = -1 的组合框。这是决定是否隐藏其他元素的组合框。在这种情况下不会是 Null。这还需要吗?
【解决方案2】:

您收到错误是因为您试图设置一个为空的对象的属性。

考虑以下

Dog rex;
rex.Colour = "Brown";

在实例化 rex 之前,您无法设置 rex 的颜色。例如,

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

尝试这样做calledUs.SelectedIndex = -1 是一回事。在calledUs 被实例化之前,您无法访问它的SelectedIndex

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

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

【讨论】:

    【解决方案3】:

    该错误表明calledUs 对象当时为空。在设置选定的索引之前,请确保对象已被实例化。

    【讨论】:

      【解决方案4】:

      把你的代码放在 InitializeComponent() 之后, 或在 Form_Load() 中,您的控件需要初始化才能访问

      【讨论】:

      • 是的,这可能会降低问题发生的可能性,但不会解决问题。如果calledUs 在任何时候为空,您仍然会收到异常。
      • 是的,你是对的,即使在初始化后控件是否可能为空我认为除非我们手动更新,否则控件不会变为空
      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 2011-04-13
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多