Невозможно программно изменить вкладки после возникновения исключения из события SelectedIndexChanged в TabControl - PullRequest
0 голосов
/ 22 сентября 2009

Это C #, вопрос Winform.

У меня есть элемент управления TabControl, и я использую две навигационные кнопки для переключения между моими вкладками. Я использовал TabControl.SelectedIndex = i, чтобы изменить отображаемые вкладки в событии нажатия кнопок. Каждый раз, когда будет показана конкретная вкладка, вызывается одна из нескольких функций для подготовки некоторой фоновой работы. Вызовы функций помещаются в событие TabControl.SelectedIndexChanged.

Я столкнулся с проблемой. Если из события TabControl.SelectedIndexChanged выдается исключение (из одной из нескольких функций, вызываемых в этом событии), я больше не могу использовать программный способ переключения между вкладками. После того, как выдается одно исключение, кнопки навигации не могут изменить отображаемую вкладку TabControl. Точнее говоря, SelectedIndex для TabControl все еще можно изменить, пользовательский интерфейс вкладок по-прежнему изменяется, но содержимое страницы вкладок остается тем же, что и страница, для которой выброшено исключение.

Кто-нибудь сталкивался с этой проблемой раньше? Любое решение? Большое спасибо.

1 Ответ

2 голосов
/ 22 сентября 2009

Как правило, исключения в обработчиках событий 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, чтобы отменить изменение вкладки.

...