2009-09-22 2 views
0

이것은 C#, Winform 질문입니다.TabControl의 SelectedIndexChanged 이벤트에서 예외가 발생하면 프로그래밍 방식으로 탭 페이지를 변경할 수 없습니다.

TabControl 컨트롤이 있고 두 개의 탐색 단추를 사용하여 내 탭 페이지간에 전환합니다. TabControl.SelectedIndex = i를 사용하여 버튼의 클릭 이벤트에서 탭 페이지를 표시하도록 변경했습니다. 특정 탭 페이지가 표시 될 때마다 몇 가지 기능 중 하나가 호출되어 배경 작업을 준비합니다. 함수 호출은 TabControl.SelectedIndexChanged 이벤트에 배치됩니다.

문제가 생겼습니다. TabControl.SelectedIndexChanged 이벤트 (여러 이벤트 중 하나에서 이벤트가 호출 됨)에서 예외가 발생하면 더 이상 프로그래밍 방식으로 탭 페이지간에 전환 할 수 없습니다. 한 가지 예외가 발생하면 탐색 버튼으로 TabControl의 표시 탭을 변경할 수 없습니다. 보다 구체적으로 TabControl의 SelectedIndex는 여전히 변경 될 수 있지만 탭 UI는 여전히 변경되지만 탭 페이지 내용은 예외가 발생 된 페이지와 동일하게 유지됩니다.

이전에이 문제가 발생 했습니까? 어떤 해결책? 많은 감사합니다.

답변

2

일반적으로 WinForms 이벤트 처리기의 예외를 잡아서 처리해야합니다. 예외가 스택을 WinForms 코드로 옮길 수있게되면, 사용자가 경험하는 것과 같은 이상한 동작이 일반적인 결과입니다.

Reflector을 사용하여 System.Windows.Forms.TabControl을 보면 WndProc() 메서드는 이벤트 처리기를 호출하는 WmSelChange()를 호출합니다. 이벤트 처리기에서 예외가 발생하면 예외는 스택을 WndProc로 퍼용합니다. 의 WndProc은 예외를 처리하지 않기 때문에의 WndProc의 끝이 경우/다음 문은 결코 호출되지 가져옵니다

if (m.Msg == this.tabBaseReLayoutMessage) 
{ 
    this.WmTabBaseReLayout(ref m); 
} 
else 
{ 
    base.WndProc(ref m); 
} 

따라서 탭 컨트롤의 내부 상태가 이상한 행동의 결과로 손상되었습니다.

탭을 변경하는 동안 발생할 수있는 예외를 완벽하게 처리하려면 선택 이벤트를 사용하여 배경 작업을 수행하는 것이 좋습니다 (이 이벤트는 SelectedIndexChanged 이벤트보다 먼저 발생 함). try/catch 문을 사용하고 catch 절에서 TabControlCancelEventArgs.Cancel을 true로 설정하여 탭 변경을 취소합니다.

+0

많은 감사의 말을 전합니다. 도움이됩니다. – Steve