Поддержка нескольких панелей, групповых блоков и вкладок - PullRequest
3 голосов
/ 10 июля 2009

У меня есть приложение VB.NET (2005), разработанное моим начальником, которое использует более 100 элементов управления вводом и отображением (текстовые поля, поля со списком и т. Д.), Многие из которых связаны с ярлыками. Мой босс попросил меня установить порядок вкладок, а затем перехватить нажатие клавиши, чтобы пользователь мог использовать ввод для навигации по элементам управления. У меня есть 2 приложения, как это, чтобы работать над.

Для порядка табуляции я не смог использовать функцию View / TabOrder, так как на экране так много маленьких всплывающих окон tabindex, что я не вижу никаких элементов управления в форме, по которым можно щелкнуть. Я попытался щелкнуть «через» всплывающее окно с некоторым успехом, но он все еще не дал мне порядок вкладок, который я хотел. Помощник по вкладкам, поставляемый с CodeSMART, также не дал мне желаемого результата, поэтому я мог его использовать.

Элементы управления этого пользовательского элемента управления распределены по многим группам, которые, в свою очередь, распределены по нескольким панелям splitcontainer. 1-я панель в главном splitcontainer имеет 3 основных групповых блока, которые выбираются с помощью кнопки набора инструментов (которая устанавливает желаемый групповой блок видимым и превращает остальные в невидимый.)

Пример:

Private Sub ShowMainPanel()
    'Note: Panels are groupboxes
    Me.MaterialPanel.Visible = False
    Me.HaulPanel.Visible = False
    Me.MainPanel.Visible = True

End Sub

Каждый из этих групповых блоков содержит больше групповых блоков, каждый из которых содержит от 1 до 15 элементов управления. Некоторые из них доступны только для чтения, но другим нужна информация от пользователя. Для обязательных элементов управления их табуляция установлена ​​на true.

Так что я ВРУЧНУЮ устанавливаю для каждой из таблиц основной группы индексы от 0 до 2. Затем для 1-го группового блока (основной панели) я устанавливаю табельный индекс для каждого из его элементов управления и групповых блоков, которые содержатся внутри. Для элементов управления неконтейнерного типа табличные индексы имеют значения от 0 до 25, а затем групповые блоки (подгруппы) на основной панели имеют значения от 26 до 48. Затем я перешел к каждому элементу управления в этих подгруппах и установил индекс вкладки для этих элементов управления, начиная с 0 через Control.count-1 для группы.

В итоге, мои табуляторы выглядят так (сокращенно):

mainPanel = 0
  1st fields = 0.0
  2ndfield = 0.1
  3rd field = 0.2
  1st group = 0.3
    1st field in 1st grp1 = 0.3.0
    2nd field in 1st grp1 = 0.3.1
  2nd group = 0.4
    1st field in 1st grp2 = 0.4.0
    2nd field in 1st grp2 = 0.4.1
materialPanel = 1
  1st fields = 1.0
  2ndfield = 1.1
  3rd field = 1.2
  1st group = 1.3
    1st field in 1st grp1 = 1.3.0
    2nd field in 1st grp1 = 1.3.1
  2nd group = 1.4
    1st field in 1st grp2 = 1.4.0
    2nd field in 1st grp2 = 1.4.1

Примечание: я фактически не вводил, например, 1.4.0 для tabindex, но 0 для элемента управления, 4 для подгруппы и 1 для основной группы.

Затем я устанавливаю zorder с помощью панели «Структура документа» в соответствии с порядком вкладок.

Как только я сделал все это, я наконец смог получить порядок табуляции, который я хотел работать для основной панели.

Но когда я применил то же самое к другим 2 групповым полям (materialPanel и haulpanel), вкладки полностью игнорируются. Вкладка не работает вообще в приложении. для 2-х главных групповых ящиков (MaterialPanel и HaulPanel). Приложение представляет собой Control Library, поэтому я использую встроенный UserTestContainer при отладке, а когда отображается один из 2-х 2-х групповых блоков, клавиша табуляции перемещает фокус из приложения в тестовый контейнер.

Этого не происходит, когда на 1-й групповой панели (MainPanel). Работает нормально.

Установка этого материала заняла у меня 3-4 часа на утомительную работу. Из-за большого количества элементов управления с этим приложением сложно работать, поскольку каждый раз, когда вносится изменение в конструктор форм, его обработка занимает от 15 до 20 секунд.

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 16 июля 2009

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

Можете ли вы просто захватить событие KeyPreview? Отмените нажатие клавиши, а затем просто используйте внутреннюю коллекцию порядка элементов управления, чтобы придать фокус. Учитывая количество элементов управления, кажется, что вы все равно должны делать большую часть этого в коде. Обслуживание будет намного проще, если вы используете свойство .Controls Groupbox / Panel и будете обрабатывать фокус, перебирая эту коллекцию и находя именно тот элемент управления, который вам нужен.

...