.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 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即可。
这些只不过是一些很简单的东西,提供给和我一样的新手参考。