2016-06-21 30 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()多次,這正在排除目的

相關問題