2009-05-05 3 views
0

Мы спорадически возникают ошибки при попытке обновить всплывающую подсказку, как этотNullReferenceException с ToolTip.CreateHandle

ToolTip.SetToolTip(myLabel, customDataStructure) 

Ошибка мы получаем это NullReferenceException: Object reference not set to an instance of an object

Кто-нибудь знает причину этого?

Простой Try/Catch, который ест NullReferenceException Возможный вариант? Мы не хотим, чтобы все наше приложение взорвалось, когда мы это получили.

+0

Что в исключение стека вызовов - рамочный код, свой собственный код, что-то еще? –

+0

Это, прежде всего, код рамки, но затем он возвращается обратно в мой собственный код. –

+0

@Joe: Этого можно ожидать, если вы вызываете SetToolTip из обработчика события. –

ответ

1

Я бы предположил, что вы вызываете ToolTip.SetTooltip из обработчика событий и этот обработчик иногда срабатывает до создания метки. Вероятно, вы должны защитить это, проверив отметку null, а затем убедитесь, что наконечник инструмента инициализирован на событии Load.

Вы, конечно же, не должны просто улавливать исключение, так как это скрывает проблему.

1

Попытка проверить, является ли вы настраиваете, что вар в любой ситуации, используя отладчик, например ...

Это простая Try/Поймать, съедает NullReferenceException возможным вариантом?

Это не решит проблему, она скроет ее. Плохая практика программирования.

1

Игнорирование исключений редко бывает хорошей идеей. Исключение выбрано потому, что что-то не так в текущей реализации. Путем игнорирования исключения приложение в основном переходит в неопределенное состояние, и вы, скорее всего, увидите другие странные эффекты из-за отсутствия ссылки.

Поскольку это спорадическое явление может быть проблемой гонки, поэтому вам нужно внимательно изучить код, чтобы выяснить, есть ли ситуации, в которых эта ссылка может быть использована до того, как она будет правильно инициализирована.

0

Я просто столкнулся с той же проблемой. Кажется, что исключение выбрано из метода ToolTip.CreateHandle(), и оно происходит только в дочернем окне MDI. Перед вызовом метода SetToolTip (...) убедитесь, что свойство Disposing родительской формы ложно. Во всяком случае, форма находится в распоряжении, поэтому вам больше не нужны всплывающие подсказки ...

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

Условием, чтобы исправить это очень просто, просто проверить если форма видна или как упоминает Бенджамин RAIBAUD Располагая = ложь перед вызовом элементов управления ToolTip SetToolTip метод:

C#

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

В.Б..Net:

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

IMO Это то, что должно быть обработано с помощью .Net Framework ...

Смежные вопросы