2009-07-10 4 views
3

100 개 이상의 입력 및 표시 컨트롤 (텍스트 상자, combox 등)을 사용하는 많은 상사가 설계 한 VB.NET (2005) 응용 프로그램이 있습니다. 내 상사가 탭 순서를 설정하고 사용자가 Enter 키를 사용하여 컨트롤을 탐색 할 수 있도록 키 누르기를 요청했습니다. 나는이 일을 할 수있는 2 가지 앱을 가지고있다.여러 패널 및 그룹 박스 및 탭 순서 유지 보수

페이지 순서에 파란색 Tabindex 팝업이 너무 많아 보이기 때문에보기/TabOrder 기능을 사용할 수 없으므로 클릭 할 양식의 컨트롤을 볼 수 없습니다. 나는 성공을 통해 팝업을 '클릭'하려고 시도했지만 여전히 원하는 탭 순서를 제공하지 못했습니다. CodeSMART와 함께 제공된 탭 도우미는 나에게 원하는 결과를주지 못했기 때문에 사용할 수있었습니다.

이 사용자 컨트롤의 컨트롤은 여러 그룹으로 분산되어 있으며 여러 그룹으로 나누어 져 있습니다. 메인 SplitContainer가있는 1 패널은 toolstripbutton 통해 선택된 3 주 groupboxes 갖는다

예 (원하는 표시하는 그룹 상자 보이지에 다른 회전을 설정한다.)

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

End Sub 

이러한 groupboxes 각 각각 1 ~ 15 개의 컨트롤을 포함하는 더 많은 그룹 박스를 포함합니다. 일부는 읽기 전용이지만 다른 사용자는 사용자의 정보가 필요합니다. 필요한 컨트롤에는 탭 정지가 true로 설정되어 있습니다.

그래서 나는 메인 그룹 패널 tabindexes를 0에서 2까지 수동으로 설정합니다. 그런 다음 첫 번째 그룹 상자 (주 패널)에 대해 그 안에 포함 된 컨트롤과 그룹 박스 각각에 대해 tabindex를 설정합니다. 비 컨테이너 유형 컨트롤의 tabindexes는 0에서 25로 설정되고 주 패널의 그룹 상자 (하위 그룹)는 26부터 48까지입니다. 그런 다음이 하위 그룹의 각 컨트롤로 이동하여에서 시작하는 컨트롤의 탭 인덱스를 설정했습니다. 그룹의 Control.count-1을 통해 0입니다. 요약

, 내 탭 순서는 (약칭 함)과 같이 :

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 

참고 : 나는 실제로 들어, 제어, 예를 들어, 4 tabIndex를위한 1.4.0하지만 0을 입력하지 않은 하위 그룹은 1이고 주 그룹은 1입니다.

그런 다음 탭 순서에 따라 문서 개요 패널에서 zorder를 설정합니다.

일단 내가이 모든 작업을 마침내 주 패널에 대해 작업하고 싶은 탭 순서를 얻을 수있었습니다.

하지만 다른 두 개의 그룹 상자 (materialPanel 및 haulpanel)에 적용하면 탭이 완전히 무시됩니다. 탭이 앱에서 전혀 작동하지 않습니다. 2 번째 주 그룹 박스 (MaterialPanel 및 HaulPanel). 앱은 컨트롤 라이브러리이므로 디버깅 할 때 내장 된 UserTestContainer를 사용하고 두 번째 두 그룹 상자 중 하나가 표시되면 탭 키가 앱에서 포커스를 테스트 컨테이너로 이동시킵니다.

첫 번째 그룹 상자 (MainPanel)에있을 때 발생하지 않습니다. 그것은 잘 작동합니다.

지루한 작업에 약 3-4 시간이 걸렸습니다. 컨트롤의 수 때문에이 응용 프로그램은 작업하기가 어렵습니다. 언제든지 양식 디자이너를 변경하면 처리하는 데 15-20 초가 걸립니다.

여기에 무슨 일이 일어나고 있는지 실마리가 있습니까?

답변

0

GroupBox에 양식의 마지막 탭 색인이 할당되어있는 것처럼 들리므로 다음 번에 입력 초점 옵션은 양식 자체 (이 경우 테스트 컨테이너)입니다.

KeyPreview 이벤트를 캡처 할 수 있습니까? 키 누르기를 취소 한 다음 내부적으로 유지 관리되는 컨트롤 순서 컬렉션을 사용하여 포커스를줍니다. 컨트롤의 수를 감안할 때 어쨌든이 코드의 대부분을 수행해야하는 것처럼 보입니다. Groupbox/Panel의 .Controls 속성을 사용하고 해당 컬렉션을 반복하고 원하는 정확한 컨트롤을 찾는 경우 포커스를 처리하면 유지 관리 작업이 훨씬 쉬워집니다.

+0

Usercontrol 전혀 Keypreview 이벤트를 처리하지 않습니다. 나는 '누가 부모가 될 것인가'를 발견 한 후에 후기 바인딩을 할 수 있을지 모르지만 그게 효과가 있을지 확신하지 못합니다. 내가 할 수있는 최선은 반환 키를 누를 때 탭 키를 보낼 수있는 일반 KeyPress 이벤트 처리기를 추가하는 것이지만 각 컨트롤은 핸들 목록에 나열되어야합니다. 4 ~ 5 개의 KeyPress 이벤트를 만들어서 읽을 수 있도록했습니다. 임시 해결책은 컨테이너를 포함하여 각 컨트롤에 고유 한 tabindex를 순서대로 지정하는 것으로 작동하는 것으로 보입니다. 하지만 원래의 솔루션이 효과가 있다고 생각했을 것입니다. – Marshall

+0

당신이'ProcessCmdKey()'를 오버라이드 (override)하기 위해 사용자 - 컨트롤 모양의 핵심 사건들을 포착하고 싶다면. – K3N