个人理解:WinForm中Focus()和TabIndex

http://www.cnblogs.com/jaywingod/archive/2008/01/26/1054314.html

    最近在做一个WinForm的项目,发现一些问题,还是与WebForm有较大的不同。由于我对UI的东西不是很熟,所以在一些简单的问题上,遇到不少的麻烦,其中一个就是控件的Focus()方法和TabIndex属性。
    首先我们来看一下$对TabIndex的解释。
    针对WebForm的解释:

C#
public virtual short TabIndex { get; set; }

属性值
Web 服务器控件的选项卡索引。默认值为 0,表示未设置此属性。
异常类型条件

ArgumentOutOfRangeException

指定的选项卡索引不在 -32768 和 32767 之间。

使用 TabIndex 属性指定或确定 Web 窗体页上 Web 服务器控件的选项卡索引。当按 Tab 键时,Web 服务器控件接收焦点的顺序由每个控件的 TabIndex 属性确定。当最初加载页时,按 Tab 键时接收焦点的第一项是地址栏。然后,Web 窗体页上控件的 Tab 键顺序根据每个控件的 TabIndex 属性值,从最小的非零正值开始按升序排列。如果多个控件共享同一选项卡索引,则这些控件将按它们在 Web 窗体页上的声明顺序接收焦点。最后,具有零选项卡索引的控件的 Tab 键顺序按它们的声明顺序排列。

Note注意

只有具有非零选项卡索引的控件才呈现 tabindex 属性。

通过将 TabIndex 属性设置为负值,可以从 Tab 键顺序中移除 Web 服务器控件。

    当时一个负责UI的同事告诉我, TabIndex从1开始,设置为0,将无效,并发了这篇文章给我看。但是由于我在试验的过程中发现,设置为0的控件首先获得焦点,所以就抱着怀疑的态度看完了这篇文章,再仔细一看,才发现在这个是WebControl的接受,于是我接着搜,发现下面的介绍:

Tab 键索引较低的控件将先于 Tab 键索引较高的控件接收焦点。

    没有对0作特殊的说明。
   
    通过观察,我个人得出以下结论:

    在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();
======================================================
    以上的一些观点和方法,只代表个人目前的浅薄认识,不保证正确,记在这里,供个人日后思考,也为感兴趣的朋友提供一个思考问题的方面,仅此而已。
======================================================
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值