TabControl.SelectedIndex изменяется, но SelectedIndexChanged даже не стреляет - PullRequest
0 голосов
/ 20 декабря 2010

All

У меня есть TabControl в приложении, которое стало странно себя вести. Немного предыстории ...

Эта программа была преобразована из VB6 в VB .NET 2008 и использовалась для обращения к формам с использованием имен их классов. Другими словами, у меня может быть класс формы с именем frmFoo. В коде программы вы можете увидеть:

frmFoo.Show()

или

frmFoo.UserDefinedProperty = True

Во время некоторых недавних изменений я создал переменные для представления экземпляров моих форм, наподобие этих:

Public MyForm as frmFoo

MyForm = New frmFoo
MyForm.Show()

При этом я также удалил код из обработчика события Load формы и поместил его в конструктор формы.

Когда форма загружается или когда документ загружается и должен влиять на выбранный индекс TabControl, что-то вроде следующего не обязательно вызовет событие SelectedIndexChanged.

MyForm.tbsForm.SelectedIndex = ValueReadFromFile

... или ...

MyForm.tbsForm.Tabs(ValueReadFromFile).Select

Извините, что так многословен, но есть и другое. Если я открою форму и посмотрю на TabControl, чтобы убедиться, что он установлен правильно, все работает так, как должно. Неправильное поведение TabControl содержится в другом TabControl, поэтому я должен щелкнуть родительский TabControl, чтобы увидеть его. Если я вижу его и запускаю тест, тест всегда работает. Если я не вижу его и запускаю тест, то первый тест, который я запускаю, не вызовет событие. ... пейджинг доктора Гейзенберга ...

Это похоже на то, как если бы сначала нужно было инициализировать элемент управления, изменив значение или сделав его видимым на экране ... Я полностью потерян на этом. Это самое необычное поведение, которое я когда-либо видел. И все работало отлично, прежде чем я начал использовать переменные для представления форм и поместил код события Load в конструкторы форм.

Может кто-нибудь помочь или хотя бы избавить меня от моих страданий? SH

----------------------------------------------- --------------- Редактировать # 2
Я только что выполнил тест после попытки устранить некоторые изменения в поведении. Но я хотел подтвердить ранее заявленное поведение.

Я открыл программу и прочитал файл. Этот файл содержал значение, которое должно было вызвать обработчик события. Не делая элемент управления видимым, я могу изменить свойство SelectedIndex элемента управления вкладкой без запуска события.

Я снова закрыл программу и снова открыл ее. На этот раз выбрал родительскую вкладку, которая позволяла видеть дочернюю вкладку (ту, событие которой меня интересует). Затем я выбрал другую вкладку в родительском элементе управления, что означает, что дочерний элемент управления больше не был виден. Когда я открыл тот же файл, что и раньше, это вызвало событие.

Я испытываю желание реализовать флаг, который подтверждает, что элемент управления был перекрашен или была отображена родительская вкладка. Возможно, мне придется запустить событие в коде, если флаг не установлен.

Я хочу повторить, что все работало, когда программа ссылалась на формы по именам классов, и большая часть расположения элементов управления на формах была выполнена в событии load. Теперь программа создает переменные, а расположение элементов управления выполняется в конструкторе формы. Я уверен, что это как-то связано с моей проблемой, но я не могу понять как. Любой мудростью поделиться?

1 Ответ

0 голосов
/ 21 декабря 2010
MyForm.tbsForm.SelectedIndexChanged = ValueReadFromFile

не имеет большого смысла. Вы пытаетесь назначить обработчик для события SelectedIndexChanged? или ValueReadFromFile - имя вкладки?

То, что вы говорите, это то, что у вас есть два элемента управления вкладками, скажем, A и B. Элемент управления B с вкладками содержится на вкладке A, и, если A не выбрана страница вкладки, содержащая элемент управления B, SelectedIndexChanged Событие B не сработает, если вы измените его вкладку программно?

Каким образом вы пытались выбрать вкладку в дочернем элементе управления вкладками и когда выполняется этот код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...