最近在做一個WinForm的項目,發現一些問題,還是與WebForm有較大的不同。由於我對UI的東西不是很熟,所以在一些簡單的問題上,遇到不少的麻煩,其中一個就是控件的Focus()方法和TabIndex屬性。
首先我們來看一下$對TabIndex的解釋。
針對WebForm的解釋:
public virtual short TabIndex { get; set; }
屬性值
Web 服務器控件的選項卡索引。默認值爲 0,表示未設置此屬性。使用 TabIndex 屬性指定或確定 Web 窗體頁上 Web 服務器控件的選項卡索引。當按 Tab 鍵時,Web 服務器控件接收焦點的順序由每個控件的 TabIndex 屬性確定。當最初加載頁時,按 Tab 鍵時接收焦點的第一項是地址欄。然後,Web 窗體頁上控件的 Tab 鍵順序根據每個控件的 TabIndex 屬性值,從最小的非零正值開始按升序排列。如果多個控件共享同一選項卡索引,則這些控件將按它們在 Web 窗體頁上的聲明順序接收焦點。最後,具有零選項卡索引的控件的 Tab 鍵順序按它們的聲明順序排列。
注意 |
---|
只有具有非零選項卡索引的控件才呈現 tabindex 屬性。 |
通過將 TabIndex 屬性設置爲負值,可以從 Tab 鍵順序中移除 Web 服務器控件。
通過觀察,我個人得出以下結論:
在WinForm中,TabIndex與“層”有關,假如有兩個panel,panel1(裏面有txtName,txtPassword)和Panel2(txtAddress,txtunit),那麼,TabIndex的順序是這樣的。
首先在最外層(panel)選取index最小的控件,然後把光標定位到該panel中tabindex最小的控件上。這貌似在MSDN上沒有提到。
=============================================
Focus()方法的用法。
最開始,我在Form_Load()方法中設置this.txtName.Focus(),但是顯示出來的結果不如人所願,查MSDN,並沒有什麼發現, 於是試了好多中組合(與TabIndex),以爲是父子控件的問題,通過試驗發現,在Form_Load中這樣寫,可以實現設置焦點的功能:
this.txtName.Focus();
this.txtName.tabIndex = 0;
以爲自己有了一個偉大的發現,但是,經過幾次的試驗,發現有時行,有時不行……難道有什麼魔咒?
經過幾番的試驗,得出一個結論。(其實不知道正確與否)
關於Focus():
“研究發現”,該方法並沒有魔咒,也不是$的Bug,主要與他的使用位置有關。在http://www.cnblogs.com/michaellee /archive/2008/01/25/1053366.html中,提到,控件的Focus()與enable和visible有關,在 Form_Load中,該控件的visible屬性不一定爲true,所以,這個時候設置focus()不能成功。因此,要實現Focus(),可以這 樣:
1、像剛纔那篇文章的作者提到的,在Form_Load中這樣寫:
this.Show();
this.txtName.Focus();
但是我覺得這樣的做法不是特別好,因爲我們知道,在Form_Load事件之後,還有很多事件發生,我覺得在這些事件中設置焦點更好。
在Activated方法中實現:
this.txtName.Focus();
======================================================
以上的一些觀點和方法,只代表個人目前的淺薄認識,不保證正確,記在這裏,供個人日後思考,也爲感興趣的朋友提供一個思考問題的方面,僅此而已。
======================================================