2009-03-03 4 views
1

속성 설정 접근 자에서 throw되는 예외가 전역 예외 처리기에서 발견되지 않는 문제가 있습니다.바운드 속성에서 Databound numericupdown 'hiding'예외가 throw되었습니다.

더 큰 응용 프로그램에서 문제가 발생했으며 문제를 해결하는 데 많은 문제가 발생하여 간단한 프로젝트에서 문제를 재연하고 성공했습니다.

다음은 코드와 동작입니다. 누군가가이 동작을 설명해 주시겠습니까? 그리고 전역 이벤트 처리기에 의해 예외가 잡히는 원하는 결과를 얻기 위해 어떻게 올바르게 코딩해야하는지. 나는 프로그램이 확실히이 시점 경우에 중단됩니다 '새 경우 ArgumentNullException을 던져'줄에 중단 점을 설정하면

//Program.cs - Wire up global exception handling 
static class Program 
{ 
[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

    Application.Run(new Form1()); 
} 

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
{ 
    MessageBox.Show("Exception occured : " + e.Exception.Message); 
} 

*

//In main form create instance of class containing bound property and setup databinding 
//to numericUpDown control 
private void Form1_Load(object sender, EventArgs e) 
{ 
    _car = new Car(); 
    _car.NumberOfWheels = 4; 
    numericUpDown1.DataBindings.Add(new Binding("Value", _car, "NumberOfWheels", true, DataSourceUpdateMode.OnPropertyChanged)); 
} 

*

public int NumberOfWheels 
{ 
    get { return _numberOfWheels; } 
    set 
    { 
     if (value < 4) 
      //Throw some exception 
      throw new ArgumentNullException("Argument null exception trigger in Number Of Wheels property"); 

     _numberOfWheels = value; 
    } 

}

NumberOfWheels 속성에 바인딩 된 numericUpDown 컨트롤의 값을 변경합니다. 그러나 이것은 예외가 발생했는지를 탐지하는 유일한 방법입니다. UI를 통해 던져지는 예외, 즉 전역 예외 처리기에서 포착되지 않는 메시지는 표시되지 않습니다.

버튼을 클릭하여 속성의 값을 변경하면 예외가 발생하고 처리기에서 메시지 상자가 표시되면서 예외가 발생합니다.

무엇이 누락 되었습니까?

답변

0

바인딩은 예외를 "삼키거나"숨길 것입니다. 아마도 이것은 내결함성이 더 강하기 때문입니다.

BindingComplete 이벤트를 수신하고 BindingCompleteEventArgs BindingCompleteState 속성에서 BindingCompleteState를 확인해야합니다. 이 값이 BindingCompleteState.Exception이면 BindingCompleteEventArgs Exception 속성에는 Throw 된 Exception이 포함됩니다.

public Form1() 
    { 
     InitializeComponent(); 

     Binding binding = new Binding("Value", _car, "NumWheels", true, DataSourceUpdateMode.OnPropertyChanged); 
     numericUpDown1.DataBindings.Add(binding); 
     binding.BindingComplete += new BindingCompleteEventHandler(binding_BindingComplete); 

    } 

    void binding_BindingComplete(object sender, BindingCompleteEventArgs e) 
    { 
     if (e.BindingCompleteState == BindingCompleteState.Exception) 
     { 
      throw e.Exception; 
     } 
    } 
0

매우 도움이되었다 나를 데이터 바인딩에 대한 자세한 내 지식을 확장 허용 감사

Mufaka

. 그러나 예외는 여전히 전역 예외 처리기에서 발견되지 않습니다. binding_BindingComplete의 마지막 '}'에서 코드가 중단되고 "ArgumentNullException이 사용자 코드에 의해 처리되지 않았습니다"라는 메시지가 표시됩니다. 내가

binding.FormattingEnabled = false; 

을 설정하지만, 이것은 그 자체가 문제의이 나타나는 경우에 나는 당신이 설명하는대로 일을 얻을 수

수있는 유일한 방법입니다.

내가 지금 할 일은 접근 방식을 취하는 것이지만 예외를 다시 던지는 대신 메시지 상자를 표시하고 원래 값으로 복원합니다.

모든 데이터 바인딩 된 컨트롤에이 핸들러를 사용할 수 있습니다.

관련 문제