2014-04-01 54 views
0

我有一個具有多個ComboBox控件的呼叫記錄表單。在SelectedIndexChanged中更改TabStop運行太遲

爲了加速數據輸入,默認值被選擇爲基於之前字段的某些字段。其中一些默認值很可能是真實的,所以我希望按照Tab鍵順序完全跳過默認字段。

例如,username字段設置成員資格類型字段的值。如果用戶是成員,那麼成員組合框將始終是成員,因此它不應該是一個TabStop,但如果用戶名是「非成員」,有幾個選擇,所以它應該是一個TabStop。

在用戶名的SelectedIndexChanged事件我有邏輯設定會員類型的接受tab但由於會員資格類型的用戶名設置在這裏他們之後的下一個領域是爲時已晚。標籤處理已經開始,並且無論該字段上的TabStop是什麼,焦點字段都將設置爲成員類型。

我不能使用焦點事件,因爲它們在用戶點擊該字段時也會觸發,並且應該仍然會激活。只有掛鉤纔會生效。

回答

0

一些fiddleing後,我想出了以下解決方案,但我無法找到任何東西之前,所以我張貼的情況下,它可以幫助其他人在此公佈。我在表單級重寫ProccessTabKey來檢查WinForms是否搞砸了。

protected override bool ProcessTabKey(bool forward) 
{ 
    //find out where we are 
    Control startingFocus = this.ActiveControl; 

    //go to the next control 
    SelectNextControl(startingFocus, forward, true, true, true); 

    //find out if we still wanted to go there, (tabstop might have been changed in a SelectedIndexChanged) 
    Control newNext = GetNextControl(startingFocus, forward); 
    while (!newNext.TabStop) 
    { 
     newNext = GetNextControl(newNext, forward); 
    } 

    //if we are in the wrong place, move to the right place 
    if (this.ActiveControl != newNext) 
    { 
     newNext.Focus(); 
    } 

    return true; 
}