Как правило, исключения в обработчиках событий WinForms должны быть перехвачены и обработаны. Если исключению разрешено подниматься вверх по стеку в коде WinForms, странным поведением - как и то, что вы испытываете - является обычным результатом.
Использование Reflector для просмотра System.Windows.Forms.TabControl, его метод WndProc () вызывает WmSelChange (), который вызывает ваш обработчик событий. Когда в обработчике событий возникает исключение, оно просачивается вверх по стеку до WndProc. WndProc не обрабатывает исключение, поэтому оператор if / then в конце WndProc никогда не вызывается:
if (m.Msg == this.tabBaseReLayoutMessage)
{
this.WmTabBaseReLayout(ref m);
}
else
{
base.WndProc(ref m);
}
Поэтому внутреннее состояние элемента управления вкладками повреждено, что приводит к странному поведению.
Чтобы аккуратно обрабатывать исключения, которые могут возникнуть при смене вкладки, я предлагаю использовать событие Selecting для выполнения фоновой работы (это событие вызывается до события SelectedIndexChanged). Используйте оператор try / catch и в предложении catch установите TabControlCancelEventArgs.Cancel в значение true, чтобы отменить изменение вкладки.