c# - 获取选定选项卡文本的事件处理程序在后台更新线程中引发错误
问题描述
我目前正在构建 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";" 一切正常吗?
解决方案
这就是问题所在,当后台线程清除时,没有选项卡但选项卡索引已更改。然后事件处理程序尝试选择选项卡 -1 并引发异常!
这是需要的检查:
if(workOrderTabbing.SelectedIndex >= 0)
{
currWCLabel.Text = workOrderTabbing.SelectedTab.Text;
}
推荐阅读
- object - 地图内的 Lodash _.omit 函数
- java - 处理:声音文件在循环中,但只想播放一次
- openoffice-calc - 将多个电子表格中的数据读入数据库
- image - Rust - 图像箱:保存图像缓冲区的问题
- javascript - 从 React.js 中的 json 文件中获取数据
- c# - 去掉 List 中 count 和 capacity 之间的距离
- c - 将“for”循环转换为“do..while”循环
- docker - 为什么我不能在 Dockerfile 中的 FROM 之后再次使用构建参数?
- c++ - 如何在 Qt3D 中显示图像
- z3 - Z3 Python API 中的标签约束