Pergunta

Nós esporadicamente receber erros quando tentar actualizar uma dica de ferramenta, como este

ToolTip.SetToolTip(myLabel, customDataStructure)

O erro que temos é um NullReferenceException: Object reference not set to an instance of an object

Alguém sabe a causa desta?

é um simples Try/Catch que come o NullReferenceException uma opção viável? Nós não queremos que toda a nossa aplicação para explodir quando chegarmos isso.

Foi útil?

Solução

Eu diria que você está chamando ToolTip.SetTooltip de um manipulador de eventos e que manipulador às vezes dispara antes do rótulo foi criado. Você provavelmente deve guardar este com um cheque para o rótulo de ser null e certifique-se de que a ponta da ferramenta é inicializado no evento Load do rótulo.

Você certamente deve não apenas capturar a exceção como este esconde o problema.

Outras dicas

Ignorando exceções é raramente se sempre uma boa idéia. A exceção é lançada porque algo está errado na implementação atual. Ao ignorar a exceção da aplicação passa, basicamente, em um estado indefinido e você provavelmente verá outros efeitos estranhos devido à referência faltando.

Uma vez que este é esporádica que poderia ser um problema de condição de corrida, então você tem que olhar atentamente para o código para descobrir se existem situações em que a referência pode ser usado antes de ser inicializado corretamente.

Tente para testar se você está definindo que var em qualquer situação, usando o depurador, por exemplo ...

é um Try simples / catch que come o NullReferenceException uma opção viável?

Isso não resolveria o problema, seria escondê-lo. A prática de programação ruim.

A causa mais comum é quando você fechar uma janela e Validação ocorre que os conjuntos de uma dica de ferramenta em um controle invisível.

Eu não tenho depurado no Código .Net, mas tem uma boa idéia bastante onde o erro é lançado no código do 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));
    }

A condição de corrigir isso é muito simples, basta verificar se o formulário é visível ou como Benjamin Raibaud menciona Eliminação = false antes de chamar método os controles dica de ferramenta SetToolTip:

C #:

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

VB.Net:

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

IMO Isso é algo que deve ser tratado pelo .Net Framework ...

Eu corri para o mesmo problema. Parece que a exceção é lançada de dentro do método ToolTip.CreateHandle () e acontece na janela filho MDI somente sendo eliminados. Antes de chamar o método SetToolTip (...), certifique-se a propriedade Eliminar o formulário pai é falso. De qualquer forma, o formulário está sendo descartado, para que você realmente não se preocupam com as dicas mais ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top