首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在System.Windows.Forms.ToolStripControlHost.SetVisibleCore?中修复NullReferenceException

如何在System.Windows.Forms.ToolStripControlHost.SetVisibleCore?中修复NullReferenceException
EN

Stack Overflow用户
提问于 2010-09-14 21:40:09
回答 1查看 2.8K关注 0票数 1

在设置控件可见性时,我有时会得到这样的结果:

代码语言:javascript
复制
CRASH! Failed to refresh job control:
Exception:NullReferenceException
Message:Object reference not set to an instance of an object.
Source:     System.Windows.Forms
TargetSite: SetVisibleCore
StackTrace:    at System.Windows.Forms.ToolStripControlHost.SetVisibleCore(Boolean visible)
   at System.Windows.Forms.ToolStripItem.set_Visible(Boolean value)
   at Cwc.WaterWorks.Console.frmMain.SetToolStripOptionalButtons()
   at Cwc.WaterWorks.Console.frmMain.UpdateToolStrip(ToolStripButton toolStripButton)
   at Cwc.WaterWorks.Console.frmMain.RefreshJobControl(Boolean fetch)

从以下位置调用:

代码语言:javascript
复制
private void SetToolStripOptionalButtons()
{

    NewJobButtonsVisibility(newJobStripButton.Checked);
    JobListButtonsVisibility(jobListStripButton.Checked);
    jumpToJob.Visible = !newJobStripButton.Checked;

    if (newJobStripButton.Checked)
    {
        JobCreateStatus(false);
            uxLockedToolStrip.Visible = false;
        HideJobControlButtons();
    }
    else if (jobListStripButton.Checked)
    {
        UpdateFilterStatus();
        HideJobControlButtons();
    }
        else if (controlStripButton.Checked)
    {
        ShowJobControlButtons();
        }

        findCustomerStripButton.Enabled = newJobStripButton.Checked && basis2ServiceLayer.Basis2Status.IsConnected==true;
    filterStripDropDown.Enabled = jobListStripButton.Checked;
}

你知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-24 07:40:48

我可以用一个小的测试表单重现这个崩溃:

代码语言:javascript
复制
public partial class Form1 : Form {
    public Form1() {
        var strip = new ToolStrip();
        test = new ToolStripControlHost(new TextBox());
        strip.Items.Add(test);
        this.Controls.Add(strip);
    }
    protected override void OnMouseClick(MouseEventArgs e) {
        test.Dispose();
        test.Visible = true;
    }
    ToolStripItem test;
}

单击该窗口,然后单击kaboom:

代码语言:javascript
复制
System.NullReferenceException was unhandled
  Message="Object reference not set to an instance of an object."
  Source="System.Windows.Forms"
  StackTrace:
       at System.Windows.Forms.ToolStripControlHost.SetVisibleCore(Boolean visible)
       at WindowsFormsApplication1.Form1.OnMouseClick(MouseEventArgs e) in C:\Users\hpass_000\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs:line 21
       ...
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at WindowsFormsApplication1.Program.Main() in C:\Users\hpass_000\AppData\Local\Temporary Projects\WindowsFormsApplication1\Program.cs:line 15

因此,您正在尝试在释放Toolstrip项之后对其进行更新。除此之外,我们不清楚你的程序是如何进入这种状态的。线程问题的概率非常高,即使在用户关闭窗口后,线程仍会继续调用。this answer的主题。

你真的应该解决核心问题,但Q&D修复可能会解决你的崩溃是:

代码语言:javascript
复制
private void SetToolStripOptionalButtons()
{
    if (this.Disposed) return;
    // etc...
}

尽管它现在很可能会在其他地方崩溃。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3709393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档