NullReferenceException с ToolTip.CreateHandle - PullRequest
0 голосов
/ 05 мая 2009

Мы время от времени получаем ошибки, когда пытаемся обновить всплывающую подсказку, например

ToolTip.SetToolTip(myLabel, customDataStructure)

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

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

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

Ответы [ 5 ]

1 голос
/ 04 января 2016

Наиболее частая причина этого - закрытие окна и проверка, устанавливающая всплывающую подсказку для невидимого элемента управления.

Я не отлаживал в .Net Code, но довольно неплохо представляю, где в коде 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 упоминает 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 ...

1 голос
/ 06 мая 2009

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

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

1 голос
/ 06 мая 2009

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

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

1 голос
/ 06 мая 2009

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

Является ли простой Try / Catch, который ест исключение NullReferenceException, возможным?

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

0 голосов
/ 12 августа 2009

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

...