2016-06-21 109 views
1

我遇到分离器面板失去控制权并需要将其设回的问题。将焦点设置为以前的控件

我的应用程序使用SplitContainer;当我的控制器加载分离器的面板2中的数据时,焦点正在转移到面板1。

在两个面板中都有tabStop = true的控件,因为选项卡和Shift +选项卡需要在面板和分离器上工作。

要重新设置它,在GotFocus中为panel2控件添加一个Control对象,并在panel1的_enter中使用此对象将焦点设置回panel2。不过,我需要重置这个控制对象;这是我在panel2的_leave中无法做到的,因为在设置后台控件GotFocus时会再次调用。

回答

1

我想你应该实现这些行为的状态管理来同步控件的事件。对于examplee,你可能会使用与您的控制对象的状态一些标志,然后verufy他们的价值观与你的GotFocus事件的一些测试......之后



更新在评论一些结算..

关于控件与焦点相关的事件的Msdn,您会发现“Enter”事件始终是事件链中的第一个事件,第二个始终是“GotFocus”。请参阅:https://msdn.microsoft.com/it-it/library/system.windows.forms.control.gotfocus(v=vs.110).aspx

您可以在“Enter”事件中评估控件焦点状态变量,并将其分配到“GotFocus”事件中,以避免在事件中重置事件。

这样,你应该总是知道以前的控制集中在“输入”每一个控件的句柄(你可以使用所有控件相同的处理程序),使您的需求..

如果您有需要在几个面板中管理一些分离的控件,你也可以实现一个字典,将每个面板映射为控件的焦点,所以如果你从一个面板切换到另一个面板,你可能总是知道该面板的最后一个控件。

+0

我试图在_gotfocus中设置一个标志为true,并且在控件A的_Leave中设置为false,但我需要将此值设置为true 。如果前一个控件是A,应用程序可以将焦点设置回A.但是,我不能让该值保持为假,因为B应该使用制表符和shift +制表符来设置焦点。然后我试着将它设置为假,但是因为我正在做一个.Focus()来控制这个标志每次都被重置为真。 – 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

我尝试了多种解决方案,并且最安全的选项似乎关闭了panel1控件上的选项卡控件,只要panel2中的控件获得焦点并在其离开焦点时将其重新打开即可。这确保了应用程序的重点不会转移到panel1。这也将确保我的控件适用于制表和shift_tabbing。强制将焦点重新设置为panel2中的控件多次触发gotfocus()多次,这正在排除目的

相关问题