0

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

ToolTip.SetToolTip(myLabel, customDataStructure)

私たちが得るエラーはNullReferenceException: Object reference not set to an instance of an object

誰かがこれの原因を知っていますか?

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

4

5 に答える 5

1

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

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

于 2009-05-05T20:08:33.667 に答える
1

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

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

それは問題を解決しないでしょう、それはそれを隠すでしょう。悪いプログラミング慣行。

于 2009-05-05T20:00:48.320 に答える
1

例外を無視することは、良い考えであるとしてもめったにありません。現在の実装に問題があるため、例外がスローされます。例外を無視することにより、アプリケーションは基本的に未定義の状態で進行し、参照が欠落しているために他の奇妙な影響が発生する可能性があります。

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

于 2009-05-05T20:01:58.863 に答える
1

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

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

これを修正する条件は非常に単純です。フォームが表示されているかどうか、またはBenjaminRAIBAUDがDisposed= falseと述べているように、ToolTipコントロールのSetToolTipメソッドを呼び出す前に確認してください。

C#:

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

VB.Net:

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

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

于 2016-01-04T02:08:33.027 に答える
0

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

于 2009-08-12T13:48:38.340 に答える