首页 > 解决方案 > 获取选定选项卡文本的事件处理程序在后台更新线程中引发错误

问题描述

我目前正在构建 ac# 调度应用程序,但我似乎无法理解为什么这段代码:

    private void TabControl1_SelectedIndexChanged(Object sender, EventArgs e)
    {
           currWCLabel.Text = workOrderTabbing.SelectedTab.Text;
    }

导致这段代码在“workOrderTabbing.Invoke(d, new object[] { });”处崩溃 线?

错误:System.Windows.Forms.dll 中出现“System.NullReferenceException”类型的未处理异常

附加信息:对象引用未设置为对象的实例..)

    private void clearDGVTextSafe()
    {
        if (workOrderTabbing.InvokeRequired)
        {
            var d = new safeClearDGVDelgate(clearDGVTextSafe);
            workOrderTabbing.Invoke(d, new object[] { });
        }
        else
        {
            workOrderTabbing.TabPages.Clear(); ;
        }      
    }

上面的代码由后台线程调用以在重新绘制之前清除计划。在我看来,这两者应该是完全分开的吧?如果我将文本行更改为 "currWCLabel.Text = "blah blah blah";" 一切正常吗?

标签: c#user-interfacethread-safety

解决方案


这就是问题所在,当后台线程清除时,没有选项卡但选项卡索引已更改。然后事件处理程序尝试选择选项卡 -1 并引发异常!

这是需要的检查:

        if(workOrderTabbing.SelectedIndex >= 0)
        {
            currWCLabel.Text = workOrderTabbing.SelectedTab.Text;
        }

推荐阅读