2012-05-17 2 views
2

MS Chart 컨트롤에 의해 throw 된 예외를 잡을 수없는 이유를 알 수 없습니다. Visual Studio 2010을 최신 업데이트와 함께 사용하고 있습니다. 당신의 도움에 감사드립니다.MS Chart 컨트롤 예외를 수신 할 수 없습니다.

다음은 문제가 다시 생성하는 방법은 다음과 같습니다

  • 을 새로운 윈폼 응용 프로그램
  • 버튼을 드롭 기본 폼에 System.Windows.Forms.DataVisualization
  • 에 대한 참조를 추가하고 만들기 차트 컨트롤은
  • 폼의 생성자에 다음 코드를 추가

    int[] x = new int[] { 1, 2, 3, 4, 5 }; 
        int[] y = new int[] { 5, 13, 4, 10, 9 }; 
        chart1.Series[0].Points.DataBindXY(x, y); 
    
  • 양식

이상 실행되지 않습니다 catch 블록에있는 버튼을 클릭하여 응용 프로그램

  • 을 실행 버튼의 클릭 방법

    try 
        { 
         chart1.Series[0].Label = "#VAL{"; 
        } 
        catch 
        { 
         MessageBox.Show("Exception caught"); 
        } 
    
  • 에 다음 코드를 추가합니다. 대신 레이블 문자열에서 잘못된 키워드를 사용하여 Throw 된 "InvalidOperationException"이 응용 프로그램의 Main 메서드를 버립니다.

  • +0

    다른 스레드에서이 작업을 수행하고 있습니까? – leppie

    +0

    아닙니다. 앞서 언급 한 문제를 재현하는 단계는 표준 단일 스레드 winforms 응용 프로그램 템플릿을 사용합니다. – veezi

    답변

    1

    이것은 컨트롤에 흔히 발생하는 오류 모드는 아닙니다. 문제는 Label 속성의 속성 설정자가 할당 된 값이 합법적인지 확인하기에 충분한 검사를 수행하지 않는다는 것입니다. 따라서 속성 값이 실제로 사용되면 잘못 될 수 있습니다. 나중에 컨트롤이 그릴 때. Call Stack 윈도우에서 쉽게 볼 수 있습니다. Chart.OnPaint()가 스택 맨 위에있는 방법에 유의하십시오. 디버거는 Application.Run()에서 실제로 소스 코드가있는 마지막 문이므로 중지됩니다. 따라서 호출 스택을 조사하십시오.

    Winforms에서 이에 대한 대책이 있지만 Application.ThreadException 이벤트가 발생합니다. 그러나 예외를 진단하는 데 도움이되는 기능인 디버깅 할 때 꺼집니다. 어쨌든 실용적이지는 않습니다. ThreadException에 대한 이벤트 핸들러는 코드에서 버그를 수정할 수 없습니다. ,

    private void button1_Click(object sender, EventArgs e) { 
         try { 
          chart1.Series[0].Label = "#VAL{"; 
          chart1.Refresh(); 
         } 
         catch { 
          MessageBox.Show("Exception caught"); 
         } 
        } 
    

    을하지만 그 중 진짜 수정이 아니다 : 당신 당신의 try 블록이 효과에있는 동안 당신이 그렇게 그림이 지연되지 않는 재 페인트를 강제해야 할 것와 폭탄 것, 예외를 잡을 수 있습니다 그것은 단지 다음 페인트 칠에 다시 폭탄을 넣을 것입니다. catch 블록의 Label 속성을 다시 할당하지 않는 한. 유일한 진정한 치료법은 코드를 수정하는 것입니다. 사용자가 레이블을 입력하도록 허용하면이 해결 방법이 좋을 것입니다. catch 블록의 레이블을 다시 설정하십시오.

    +0

    의미가 있습니다! 설명해 주셔서 감사합니다. – veezi

    +0

    catch 블록에서 올바른 레이블을 재설정 한 후 차트가 새로 고침되지 않습니다. 그러나 그것은 내가 생각하는 다른 문제입니다. 속성 검사기가 필요한 검사를 수행하거나 클래스가 ValidLabel() 메서드를 제공했는지 확인하십시오. 어쨌든 .. – veezi

    0

    Chart.Area.RecalculateAxesScale()Chart.Refresh()을 사용할 수없는 경우에도 사용할 수 있습니다.

    관련 문제