문제

세 개의 TextBox로 구성된 UserControl이 있습니다.양식에는 하나 이상의 UserControl이 있을 수 있습니다.내 자신의 탭 동작을 구현하고 싶기 때문에 사용자가 두 번째 TextBox에서 Tab을 누르면 두 번째 TextBox에 입력된 항목이 있는 경우에만 세 번째 TextBox로 이동해야 합니다.두 번째 TextBox에 아무 것도 입력되지 않으면 일반 탭 동작에 따라 양식의 다음 컨트롤에 초점이 맞춰져야 합니다.사용자가 첫 번째 또는 두 번째 TextBox 및 프레스 탭에 아무것도 입력하지 않은 경우 양식의 컨트롤을 건너뛰어야 하는 특별한 경우가 있습니다.

ProcessDialogKey를 사용하여 정상적으로 작동하도록 관리했지만 여전히 한 가지 문제가 있습니다.내 질문은 내 UserControl이 Tab 또는 Shift-Tab에서 포커스를 얻었는지 알고 싶기 때문에 WinForms 컨트롤이 어떻게 포커스를 얻었는지 감지할 수 있는 방법이 있는지 여부입니다. 그런 다음 이상한 작업을 수행하지만 사용자가 컨트롤을 클릭하면 특별한 일은 하고 싶지 않습니다.

도움이 되었습니까?

해결책

일반적으로 TAB 키의 표준 동작을 재정의하는 것은 나쁜 생각이라고 말하고 싶습니다.두 번째 텍스트 상자에 유효한 항목이 입력될 때까지 세 번째 텍스트 상자를 비활성화하는 등의 작업을 수행할 수 있습니다.

그런데 이렇게 말씀드리지만, 저도 고객의 요청으로 이 규칙을 어겼습니다.Enter 키가 텍스트 필드에 값을 저장하고 커서를 다음 필드로 이동시키는 Tab 키와 같은 Enter 키 기능을 만들었습니다.

다른 팁

나는 당신이 그것을 할 수 있는 내장된 방법이 있다고 생각하지 않습니다.모든 WinForms 포커스 이벤트(GotFocus,LostFocus,Enter,Leave)는 추가 정보를 제공하지 않는 빈 EventArgs 매개 변수를 사용하여 호출됩니다.

개인적으로는 Rob Thomas가 말했듯이 세 번째 텍스트 상자를 비활성화하겠습니다.하지만 이를 수행하기로 결심했다면 매뉴얼을 설정하는 것이 어렵지 않을 것입니다(읽기:해킹) 솔루션.탭 키를 누른 후(포커스가 두 번째 텍스트 상자에 있는 경우) 양식 내부에 변수를 설정합니다.초점이 맞춰진 다음 개체가 세 번째 텍스트 상자인 경우 해당 개체가 어떻게 발생했는지 정확히 알 수 있습니다.

이 이상한 탭 동작의 이유는 모두 입력 프로세스의 속도에 관한 것입니다.입력을 받을 수 있어서 정말 좋았습니다. 텍스트 상자를 비활성화할 생각은 없었지만 실제로는 작동할 수 있었습니다.그러나 입력을 수락하기 위해 Enter 키를 사용하는 것은 내 마음에도 들지 않았습니다.그러면 훨씬 더 잘 작동할 것입니다.사용자는 숫자를 입력한 후 Enter를 눌러 입력을 수락할 수 있으며 다음 가능한 텍스트 상자가 활성화됩니다.이는 케이크를 먹으면서도 먹는 것과 같습니다. Enter 키를 사용할 때 올바른 필드에 도달하기 위해 불필요한 탭 작업을 수행할 필요가 없고 숫자 키보드 옆에 있는 Enter 키를 사용하면 정말 원활해지기 때문에 속도 요소가 있습니다.

의견을 보내주셔서 감사합니다!

나는 DannySmurf의 의견에 동의합니다.탭 순서를 어지럽히면 나중에 응용 프로그램 요구 사항이 변경되면 지옥이 될 수 있습니다.

당신이 할 수 있는 또 다른 일은 사용자가 겪을 수 있는 일종의 마법사를 구현하는 것입니다.

컨트롤을 비활성화하는 것보다 TabStop을 사용하여 주변을 둘러보는 것이 좋습니다. 이것이 거짓이면 탭할 때 컨트롤을 건너뛰게 됩니다.

또한 TextBox의 Changed 이벤트가 다른 컨트롤의 TabStop을 업데이트하는 장소라고 제안하고 싶습니다.

나는 사용자가 사용자 이름이나 이메일 주소(별도의 필드에)와 비밀번호를 입력할 수 있는 로그인 컨트롤을 사용하여 이와 유사한 작업을 수행했으며, 작업을 완료하는 데 tabStop을 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top