質問

このようなツールチップを更新しようとすると、散発的にエラーが発生します

ToolTip.SetToolTip(myLabel, customDataStructure)

エラーは、 NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていない

です

この原因は誰にもわかりませんか?

NullReferenceException を食べる単純な Try / Catch は実行可能なオプションですか?これを取得したときにアプリケーション全体が爆発することは望ましくありません。

役に立ちましたか?

解決

イベントハンドラから ToolTip.SetTooltip を呼び出しており、ラベルが作成される前にそのハンドラが起動することがあると思います。おそらく、ラベルが null であるかどうかをチェックしてこれを保護し、ラベルの Load イベントでツールヒントが初期化されていることを確認する必要があります。

問題を隠すため、例外をキャッチするだけではいけません。

他のヒント

例外を無視することは、めったにないことです。現在の実装で何かが間違っているため、例外がスローされます。例外を無視することにより、アプリケーションは基本的に未定義の状態で進行し、参照が欠落しているために他の奇妙な効果が発生する可能性が高くなります。

これは散発的であるため、競合状態の問題である可能性があるため、参照を正しく初期化する前に参照が使用される可能性がある状況を把握するために、コードを注意深く調べる必要があります。

たとえば、デバッガを使用して、どのような状況でもその変数を設定しているかどうかをテストしてみてください...

NullReferenceExceptionを食べる単純なTry / Catchは実行可能なオプションですか?

それでは問題は解決せず、それが隠されます。悪いプログラミング習慣。

これの最も一般的な原因は、ウィンドウを閉じて、目に見えないコントロールにツールチップを設定する検証が発生したときです。

.Netコードをデバッグしていませんが、ToolTip.CreateHandleのコードのどこでエラーがスローされるかについてかなり良い考えがあります:

private void CreateHandle()
{
    if (this.GetHandleCreated())
    {
        return;
    }
    IntPtr userCookie = UnsafeNativeMethods.ThemingScope.Activate();
    try
    {
        SafeNativeMethods.InitCommonControlsEx(new NativeMethods.INITCOMMONCONTROLSEX
        {
            dwICC = 8
        });
        CreateParams createParams = this.CreateParams;
        if (this.GetHandleCreated())
        {
            return;
        }
        //HERE! I suspect window is null when the form is closed
        this.window.CreateHandle(createParams); 
    }
    finally
    {
        UnsafeNativeMethods.ThemingScope.Deactivate(userCookie);
    }
    if (this.ownerDraw)
    {
        int num = (int)((long)UnsafeNativeMethods.GetWindowLong(new HandleRef(this, this.Handle), -16));
        num &= -8388609;
        UnsafeNativeMethods.SetWindowLong(new HandleRef(this, this.Handle), -16, new HandleRef(null, (IntPtr)num));
    }

これを修正するための条件は非常に簡単です。フォームが表示されているかどうか、またはBenjamin RAIBAUDがDisposing = falseに言及していることを確認してから、ToolTipコントロールのSetToolTipメソッドを呼び出します。

C#:

if (!this.Disposing) ttpHoverText.SetToolTip(targetControl, brokenText);

VB.Net:

If Me.Disposing = False Then ttpHoverText.SetToolTip(targetControl, brokenText)
  

IMOこれは.Net Frameworkで処理する必要があるものです...

同じ問題に遭遇しました。 ToolTip.CreateHandle()メソッド内から例外がスローされ、MDI子ウィンドウのみが破棄される場合に発生するようです。 SetToolTip(...)メソッドを呼び出す前に、親フォームのDisposingプロパティがfalseであることを確認してください。とにかく、フォームは破棄されているので、ツールチップはもう気にしません...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top