2009-06-16 83 views
8

無論何時打開窗體,系統都會自動爲您設置一個控件。就我所知,按照Windows標準行爲,獲取焦點的控件是按Tab鍵順序排列的第一個啓用的控件。如何指定窗體打開時應關注哪個控件?

問題是如何在運行時更改此選項,而無需動態重新組合標籤順序。例如,某些表單可能希望基於程序邏輯改變最初集中的控制,以便將焦點放在最合適的控制中。如果您只是在OnLoad處理程序中集中其他控件,則默認邏輯將執行並重新聚焦默認控件。

如果你在C/C++編寫,並使用原始窗口過程或MFC,你可以從你WM_INITDIALOG處理器0(FALSE)返回,並且默認聚焦的邏輯都不會被跳過。但是,我找不到任何方式在Windows Forms中執行此操作。我拿出最好是用BeginInvokeOnLoad結束後設置焦點,就像這樣:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    BeginInvoke(new MethodInvoker(() => this.someControl.Focus())); 
} 

必須有做一些適當的方式 - 是什麼呢?

回答

13

通過Reflector搜索後,我發現什麼似乎是「正確」的方法:使用ContainerControl.ActiveControl。這可以從OnLoad(或其他地方;請參閱文檔中的限制)完成,並直接告訴框架您希望關注哪個控件。

用法示例:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    this.ActiveControl = this.someControl; 
} 

這似乎是最乾淨的,最簡單的解決方案爲止。

1
public void ControlSetFocus(Control^ control) 
    { 

     // Set focus to the control, if it can receive focus. 
     if (control->CanFocus) 
     { 
     control->Focus(); 
     } 
    }  
+0

謝謝 - 這通常用於聚焦控件,但對我描述的情況沒有幫助。 – Charlie 2009-06-16 15:05:49

+0

爲什麼?................ – 2009-06-16 15:40:36

+0

我同意亞當。您需要在表單的啓動週期稍後發生的事件。 – 2009-06-16 15:41:36

0

而不是使用你能不能用Form.ActivatedForm.Shown事件,看看他們是所謂的控制重點崗位呈現在onload事件?

相關問題