.Net中TextBox对于焦点的控制


假设我们要作如下的设计,有两个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事件中,可以中止焦点的转移。也就是说,如果数据 检查不合格,可以不让焦点转移,禁止用户继续填下一个项目,知道这个项目正确的被填入。

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

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating

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

End Sub

Private Sub TextBox1_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Validated

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

End Sub

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

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

posted @ 2006-06-08 10:23  Ronin  阅读(4542)  评论(5编辑  收藏  举报