문제

우리는 이와 같이 도구 팁을 업데이트하려고 할 때 산발적으로 오류가 발생합니다.

ToolTip.SetToolTip(myLabel, customDataStructure)

우리가 얻는 오류는 a입니다 NullReferenceException: Object reference not set to an instance of an object

누구든지 이것의 원인을 아는 사람이 있습니까?

간단합니다 Try/Catch 그게 먹는다 NullReferenceException 실행 가능한 옵션? 우리는 이것을 얻을 때 전체 응용 프로그램이 폭발하는 것을 원하지 않습니다.

도움이 되었습니까?

해결책

나는 당신이 부르는 것 같아요 ToolTip.SetTooltip 이벤트 핸들러와 해당 핸들러에서 레이블이 생성되기 전에 때때로 발사됩니다. 당신은 아마도 라벨이 있는지 확인하여 이것을 지키야 할 것입니다. null 그런 다음 라벨에서 도구 팁이 초기화되어 있는지 확인하십시오. Load 이벤트.

이것이 문제를 숨기므로 예외를 포착해서는 안됩니다.

다른 팁

예외를 무시하는 것은 거의 좋은 생각이 아닙니다. 현재 구현에서 무언가 잘못 되었기 때문에 예외가 발생합니다. 예외를 무시함으로써 응용 프로그램은 기본적으로 정의되지 않은 상태로 진행되며 누락 된 참조로 인해 다른 이상한 효과가 나타납니다.

이것은 산발적이기 때문에 인종 조건 문제 일 수 있으므로 코드를 신중하게 살펴 보려면 참조가 올바르게 초기화되기 전에 참조가 사용할 수있는 상황이 있는지 알아 내야합니다.

예를 들어 디버거를 사용하여 모든 상황에서 VAR을 설정하는지 여부를 테스트하십시오 ...

NullReferenceException을 먹는 간단한 시도/캐치가 실현 가능한 옵션입니까?

그것은 문제를 해결하지 못하고 숨길 것입니다. 나쁜 프로그래밍 연습.

이것의 가장 일반적인 원인은 창을 닫고 유효성 검사가 발생하여 보이지 않는 제어에 툴팁을 설정할 때입니다.

.NET 코드로 디버깅되지 않았지만 툴팁에서 오류가 발생하는 위치가 매우 좋습니다. 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));
    }

이것을 고치는 조건은 매우 간단합니다. 양식이 표시되는지 또는 Benjamin Raibaud가 툴팁 컨트롤을 호출하기 전에 Disposing = false를 언급 한 것처럼 다음과 같이 확인하십시오.

씨#:

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

vb.net :

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

IMO 이것은 .NET 프레임 워크에서 처리해야 할 것입니다 ...

나는 방금 같은 문제에 부딪쳤다. 툴팁 내에서 예외가 발생하는 것 같습니다. settooltip (...) 메소드를 호출하기 전에 부모 양식의 처분 속성이 거짓인지 확인하십시오. 어쨌든, 양식이 폐기되고 있으므로 더 이상 툴팁에 신경 쓰지 않습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top