Frage

Wir sporadisch Fehler erhalten, wenn wir versuchen, eine Werkzeugspitze zu aktualisieren, wie dies

ToolTip.SetToolTip(myLabel, customDataStructure)

Der Fehler, den wir bekommen, ist eine NullReferenceException: Object reference not set to an instance of an object

Kennt jemand die Ursache dafür?

Ist eine einfache Try/Catch, die die NullReferenceException eine mögliche Option isst? Wir wollen nicht unsere gesamte Anwendung zu sprengen, wenn wir diese.

War es hilfreich?

Lösung

Ich würde vermuten, dass Sie ToolTip.SetTooltip von einem Event-Handler und Handler manchmal ausgelöst wird, bevor das Label sind Aufruf erstellt wurde. Sie sollten wahrscheinlich mit einem Scheck für das Label zu sein null schützen diese und stellen Sie sicher, dass die Werkzeugspitze auf dem Load Ereignis Etikett initialisiert wird.

Sie sollten auf jeden Fall nicht nur die Ausnahme abfangen, da dies das Problem versteckt.

Andere Tipps

Ausnahmen zu ignorieren ist selten, wenn überhaupt eine gute Idee. Die Ausnahme wird ausgelöst, weil etwas falsch in der aktuellen Implementierung. Durch das Ignorieren der Ausnahme der Anwendung geht grundsätzlich in einem undefinierten Zustand und Sie werden wahrscheinlich sehen andere seltsame Effekte aufgrund der fehlenden Verweis.

Da diese sporadisch ist es ein Race-Bedingung Problem sein könnte, so dass Sie sorgfältig auf dem Code suchen, um herauszufinden, ob es Situationen geben, in denen die Referenz verwendet werden kann, bevor es richtig initialisiert wird.

Versuchen zu testen, ob Sie diese var in jeder Situation sind einstellen, um den Debugger zum Beispiel mit ...

Ist eine einfache Try / Catch, der die Nullreferenceexception eine mögliche Option isst?

Das würde das Problem nicht lösen, wäre es ausgeblendet. Eine schlechte Programmierpraxis.

Die häufigste Ursache dafür ist, wenn Sie ein Fenster und Validierung erfolgt in der Nähe, die eine Quick-Info auf einem unsichtbaren Steuersatz.

Ich habe nicht in die .NET-Code debuggt, sondern haben eine ziemlich gute Idee, wo der Fehler in der ToolTip.CreateHandle Code ausgelöst wird:

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

Der Zustand zu beheben, dies ist sehr einfach, nur prüfen, ob das Formular sichtbar ist oder als Benjamin Raibaud erwähnt Entsorgung = false, bevor die Quick-Info Kontrollen SetToolTip Methode aufrufen:

C #:

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

VB.Net:

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

IMO Dies ist etwas, das von dem .Net Framework behandelt werden soll ...

Ich lief in das gleiche Problem. Es scheint die Ausnahme von innerhalb des ToolTip.CreateHandle () -Methode ausgelöst wird, und es geschieht auf untergeordnete MDI-Fenster nur angeordnet ist. Bevor die SetToolTip Aufruf (...) Methode, stellen Sie sicher, dass die Entsorgung Eigenschaft der übergeordneten Form falsch ist. Wie dem auch sei, die Form angeordnet wird, so dass Sie nicht wirklich kümmern uns um die Tooltips mehr ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top