2016-06-21 3 views
1

컨트롤이 손실되는 스플리터 패널에 문제가있어서 다시 설정해야합니다.이전 컨트롤에 포커스 설정

내 응용 프로그램은 SplitContainer를 사용합니다. 내 컨트롤이 스플리터의 panel2에서 데이터를로드하면 focus1이 panel1로 이동합니다.

tab 및 shift + tab은 패널과 스플리터 모두에서 작동해야하기 때문에 두 패널에서 tabStop = true 인 컨트롤이 있습니다.

다시 설정하려면 GotFocus에서 panel2 컨트롤을 위해 Control 개체를 추가하고이 컨트롤을 panel1의 _enter에서 사용하여 panel2에서 포커스를 다시 설정하십시오. 그러나이 컨트롤 개체를 다시 설정해야합니다. 그것은 panel2의 _leave에서 할 수 없습니다. 다시 컨트롤 GotFocus를 설정하면 다시 호출 될 것이기 때문입니다.

답변

1

컨트롤의 이벤트를 동기화하기 위해 이러한 동작의 상태 관리를 구현해야한다고 생각합니다. examplee를 들어, 컨트롤 개체의 상태에 관련된 몇 가지 플래그를 사용할 수있는 다음



갱신 코멘트에 일부 청소 후 당신의 GotFocus 이벤트에서 몇 가지 테스트와 그 값 ... verufy ..

컨트롤의 포커스 관련 이벤트에 대한 Msdn에서 "Enter"이벤트는 항상 이벤트 체인의 첫 번째 이벤트이고 두 번째 이벤트는 항상 "GotFocus"이벤트입니다. 참조 : https://msdn.microsoft.com/it-it/library/system.windows.forms.control.gotfocus(v=vs.110).aspx

"Enter"이벤트에서 제어 포커스 상태 변수를 평가하고 "GotFocus"이벤트에 할당하여 이탈 이벤트에서 모든 사항을 재설정하지 않아도됩니다. 당신은 항상 각 컨트롤의 핸들러 (모든 컨트롤에 대한 동일한 핸들러를 사용할 수있다)하고 요구 사항을 "입력"에 초점을 맞춘 이전 컨트롤을 알아야한다 이런 식으로

..

당신은 필요가있는 경우 여러 개의 패널에서 분할 된 컨트롤을 관리하는 경우 컨트롤에 초점을 맞춘 각 패널을 매핑하는 사전을 구현할 수도 있습니다. 따라서 한 패널에서 다른 패널로 전환하면 포커스가있는 패널의 마지막 컨트롤을 항상 알 수 있습니다.

+0

_gotfocus에는 true로 설정하고 control A의 _Leave에는 false로 설정하려고 시도했지만이 값은 _enter에서 true로 설정해야합니다. 이전 컨트롤이 A 인 경우 응용 프로그램에서 A로 포커스를 다시 설정할 수 있도록합니다.하지만 B가 Tab 및 Shift + 탭을 사용하여 포커스를 설정해야하므로 해당 값을 false로 유지할 수 없습니다. 그런 다음 컨트롤 B에서 false로 설정을 시도했으나 컨트롤을 위해 .Focus()를 수행하고 있기 때문에이 플래그는 매번 true로 재설정됩니다. – Megha

+1

http://stackoverflow.com/questions/4428100/find-out-the-control-with-last-focus/37930272#37930272 및 http://stackoverflow.com/questions/에서 제공되는 솔루션을 시도해 보았습니다. 4408751/previous-focused-control-in-winforms – Megha

+0

나는 당신이 말한 것을 오해했다. 나는 모듈 수준의 스코프 제어 변수가 문제에 대한 좋은 해결책이라고 생각한다. –

1

여러 솔루션을 시도했지만 panel2 컨트롤에 포커스가있을 때마다 가장 안전한 옵션이 패널 1 컨트롤의 탭 컨트롤을 끄는 것처럼 보였습니다. 포커스를 얻었을 때 다시 켭니다. 이렇게하면 응용 프로그램 포커스가 panel1로 이동하지 않습니다. 이것은 또한 나의 컨트롤이 tabbing 및 shift_tabbing을 위해 작동하도록 보장합니다. 포커스를 패널 2의 컨트롤로 강제로 되돌려 놓으면 gotfocus()를 여러 번 트리거하여 용도를 배제했습니다.

관련 문제