2009-05-05 10 views
0

Nous obtenons sporadiquement des erreurs quand nous essayons de mettre à jour un outil de pointe, comme celui-ciNullReferenceException avec ToolTip.CreateHandle

ToolTip.SetToolTip(myLabel, customDataStructure) 

L'erreur que nous obtenons est un NullReferenceException: Object reference not set to an instance of an object

Est-ce que quelqu'un sait la cause de cela?

Est-ce qu'un Try/Catch simple qui mange le NullReferenceException une option faisable? Nous ne voulons pas que notre application entière fasse exploser quand nous obtenons ceci.

+0

Ce qui est dans la pile d'appels d'exception - le code-cadre, votre propre code, autre chose? –

+0

C'est avant tout du code de framework, mais ensuite ça saigne dans mon propre code. –

+0

@Joe: C'est normal si vous appelez SetToolTip depuis un gestionnaire d'événement. –

Répondre

1

Je suppose que vous appelez ToolTip.SetTooltip à partir d'un gestionnaire d'événements et que ce gestionnaire se déclenche parfois avant la création de l'étiquette. Vous devriez probablement le garder avec une vérification de l'étiquette null, puis assurez-vous que la pointe de l'outil est initialisée sur l'événement Load de l'étiquette.

Vous ne devriez certainement pas simplement attraper l'exception car cela cache le problème.

1

Essayez de vérifier si vous configurez que var dans toute situation, en utilisant le débogueur par exemple ...

est un simple Try/Catch qui mange la NullReferenceException une option réalisable?

Cela ne résoudrait pas le problème, il le cacherait. Une mauvaise pratique de programmation.

1

Ignorer les exceptions est rarement, voire jamais, une bonne idée. L'exception est levée car quelque chose ne va pas dans l'implémentation actuelle. En ignorant l'exception, l'application se déroule essentiellement dans un état indéfini et vous verrez probablement d'autres effets étranges dus à la référence manquante. Comme cela est sporadique, il peut s'agir d'un problème de condition de concurrence. Vous devez donc examiner attentivement le code pour déterminer s'il existe des situations dans lesquelles la référence peut être utilisée avant d'être correctement initialisée.

0

Je viens de rencontrer le même problème. Il semble que l'exception soit lancée à partir de la méthode ToolTip.CreateHandle() et que cela se produise dans la fenêtre enfant MDI étant éliminée uniquement. Avant d'appeler la méthode SetToolTip (...), assurez-vous que la propriété Disposing du formulaire parent est false. De toute façon, le formulaire est éliminé, donc vous ne vous souciez plus vraiment des info-bulles ...

1

La cause la plus fréquente de ceci est lorsque vous fermez une fenêtre et qu'une validation se produit qui définit une info-bulle sur un contrôle invisible.

Je n'ai pas débogué dans le code .Net, mais ont une assez bonne idée où l'erreur est jeté dans le code du 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)); 
    } 

La condition de résoudre ce problème est très simple, il suffit de cocher si la forme est visible ou comme Benjamin RAIBAUD mentionne au rebut = false avant d'appeler la méthode de contrôle des info-bulle:

C#:

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

VB.Net:

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

OMI C'est quelque chose qui devrait être gérée par le Framework .Net ...