.Net中TextBox对于焦点的控制

来源:互联网 发布:js 业务逻辑 模块 编辑:程序博客网 时间:2024/06/05 09:47

假设我们要作如下的设计,有两个TextBox,第一个TextBox要求的数据为日期类型,当焦点离开时把输入的日期格式进行统一。代码很简单,如下所示。


TextBox1.Text = CDate(TextBox1.Text).ToString("yyyy/MM/dd")

但是,如果要实现上述功能,在哪个事件中写代码最为合适呢?另外,在焦点转移之前,还要对输入的数据进行妥当性检查, 比如在这个例子中检查输入的数据是否是合理的日期。要对如上问题做出比较好地解决,首先要知道TextBox和焦点控制相 关的事件的发生顺序。

下图是TextBox中和焦点移动相关的事件

事件说明Enter得到焦点的时候发生。GotFocus得到焦点的时候发生,建议不使用。Leave失去焦点的时候发生。Validating失去焦点的时候发生。经常在对输入的数据进行校验的时候使用,可以中止焦点的移动。Validated失去焦点的时候发生。经常被用在输入数据校验成功之后的处理。LostFocus失去焦点的时候发生。建议不使用。

它们发生顺序如下所示

用鼠标,或者使用Focus方法进行焦点控制的时候其他方法进行焦点控制的时候共通法则TextBox1.LostFocus

TextBox1.Leave

TextBox1.Validating

TextBox1.Validated

TextBox2.Enter

TextBox2.GotFocus
TextBox1.Leave

TextBox1.Validating

TextBox1.Validated

TextBox2.Enter

TextBox1.LostFocus

TextBox2.GotFocus
TextBox1.Leave

TextBox1.Validating

TextBox1.Validated

TextBox2.Enter

有的人习惯把处理写在LostFocus事件中。从这个图可以看出,妥当的写法应该是,把对数据的检查写在Validating事件中。 而通过检查之后的处理,写在Validated事件中。而且,在Validating事件中,可以中止焦点的转移。也就是说,如果数据 检查不合格,可以不让焦点转移,禁止用户继续填下一个项目,知道这个项目正确的被填入。

现在回到刚才的那个例子,具体实现代码如下所示:

PrivateSub TextBox1_Validating(ByVal senderAs Object, ByVal e As System.ComponentModel.CancelEventArgs)Handles TextBox1.Validating

    If Not IsDate(TextBox1.Text) Then
       
MsgBox("请输入有效日期。", MsgBoxStyle.Information)
        e.Cancel =
True
   
EndIf

EndSub

PrivateSub TextBox1_Validated(ByVal senderAs Object, ByVal e As System.EventArgs) Handles TextBox1.Validated

    TextBox1.Text = CDate(TextBox1.Text).ToString("yyyy/MM/dd")

End Sub

这样,如果输入的数据不正确,将无转移到其他TextBox,也无法触发其他按钮。但是,如果有一些按钮,不管输入的数据是不是正确 都需要可以触发的话(比如取消按钮),只要设置那个按钮的CausesValidation属性为False即可。

这些只不过是一些很简单的东西,提供给和我一样的新手参考。