我在窗体里放置两个文本框(Text1和Text2),输入下面代码
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then Text2.SetFocus
End SubPrivate Sub Text1_Validate(Cancel As Boolean)
    Debug.Print "t1v"
End Sub但发现在Text1按回车,Text2倒是获取焦点,但并没有执行Text1_Validate里的语句,请问要如何才能触发Text1_Validate事件不想用Text1_LostFocus,因为Text1_LostFocus没有Cancel

解决方案 »

  1.   

    将鼠标移走其他的地方点击。 如果想自己用代码进行判断,就不需要激发这个事件,直接在 
    If KeyAscii = 13 Then 
      '写自己的代码
    end if
      
    ————————————————————————————————————
    写作,虽然每个人都会查阅辞海,可,不是人人都能写出不朽的篇章的。编程,如是也。
      

  2.   

    网上资料:Validate事件 
    在焦点转换到一个(第二个)控件之前发生,此时该控件的 CausesValidation 属性值设置为True。 语法 Private Sub object_Validate(KeepFocus As Boolean) Validate事件、 CausesValidation属性示例 
    该示例使用三个控件来示范Validate 事件和CausesValidation 属性的使用。在缺省情况下,两个TextBox 控件的CausesValidatio n属性设置为 True,这样当您想把焦点从一个TextBox转换到另一个时,Validate 事件发生。如果 Text1没有包含日期或 Text2没有包含一个大于10的数字,焦点的转换将被阻止。由于 Command1控件的CausesValidation 属性设置为 False,因此您无论何时都可以单击Help 按钮。 要试验该示例,在窗体中放置一个CommandButton 和两个TextBox 控件,将代码粘接到窗体的“声明”部分并运行此工程。按Tab 键尝试转换焦点。 Private Sub Form_Load() 
    '设置按钮的CausesValidation属性为False。当用户 
    '单击按钮时,Validate事件不发生。 
    '设置按钮的Caption属性为“帮助”。 
    With Command1 
    .CausesValidation = False 
    .Caption = "Help" 
    End With Show 
    With Text1 '选择Text1的文本并为它设置焦点。 
    .SelLength = Len(Text1.Text) 
    .SetFocus 
    End With 
    End Sub Private Sub Command1_Click() 
    '当单击此按钮时给出用户帮助信息。 
    MsgBox _ 
    "Text1 must be set to a date." & VbCrLF & _ 
    "Text2 must be a number less than 10." 
    End Sub Private Sub Text1_Validate(KeepFocus As Boolean) 
    '如果值不是一个日期,则保持焦点,除非用户 
    '单击Help。 
    If Not IsDate(Text1.Text) Then 
    KeepFocus = True 
    MsgBox "Please insert a date in this field.", , "Text1" 
    End if 
    End Sub Private Sub Text2_Validate(KeepFocus As Boolean) 
    '如果值是一个大于10的数字,保持焦点。 
    If Not IsNumeric(Text2.Text) Or Val(Text2.Text) > 10 Then 
    KeepFocus = True 
    MsgBox _ 
    "Please insert a number less than or equal to 10.", , "Text2" 
    End If 
    End Sub Validate事件语法包含下面几部分: 部分 描述 
    object 一个对象表达式,其值为“应用于”列表中的一个对象。 
    KeepFocus 确定控件是否失去焦点的值。KeepFocus设置为True时,控件保持焦点。 
    说明 Validate 事件和CausesValidation 属性协同工怍,防止控件失去焦点直到满足确定的准则。 重点 只有在即将获得焦点的控件的CausesValidation属性值设置为True时,Validate事件才发生。
      

  3.   

    谢谢两位,两位讲的我知道,我现在的问题是有时焦点已经离开,并没有触发Validate 事件。例如我上面的用SetFocus转移焦点时,或是用鼠标点击SSTAB等某些控件时,都不会触发Validate,只触发LostFocus事件,但LostFocus事件里并没有办法在判断值无效时直接取消焦点的转移
      

  4.   

    3.在文本框控件中,当用鼠标移动焦点时,触发Validate 事件,但用SetFocus 方法移动焦点时,并不触发Validate 事件,因此要通过回车键实现焦点转移,必须在KeyPress事件中,当KeyAscii=13时,编写代码来判断条件是否成立或调用Validate 事件。原文:
    http://www.ytvc.com.cn/xbshzh/jsjnew/VBJPK/syzd/syzd12.htm
      

  5.   

    To yachong(蚜虫) 我发现不仅用SetFocus不会触发,如果获取焦点的控件是SSTAB、FlexGrid,也不会触发 可不可以在LostFocus事件里判断,然后再拦截并吃掉焦点转移的系统消息,如果可以那要怎么做
      

  6.   

    我试验了一下,sstab肯定可以。是不是sstab的CausesValidation属性设置不正确?
      

  7.   

    To yachong(蚜虫)   我的意思是在当焦点在文本框时,点击sstab来转换焦点到sstab,这时不会触发文本框的Validate 事件
      

  8.   

    似乎在早期VB版本中,只能用LostFocus进行数据检查,后期的VB版本才引入了Validate事件。
    用LostFocus检查数据有一个缺陷——一旦焦点进入文本框,在输入正确数据之前用户根本没有办法把焦点移动到其它控件,用户甚至没有办法去点击“帮助”按钮或者“关闭”按钮。
    所以尽量用Validate事件比较好。因为我们可以通过设置CausesValidation属性,使得用户点击帮助(关闭)按钮的时候不触发数据检查代码段。
      

  9.   

    我的意思是在当焦点在文本框时,点击sstab来转换焦点到sstab,这时不会触发文本框的Validate 事件
    ========================================
    我试过了是可以触发的。
    无论文本框是否放到sstab里面,点sstab的时候都会触发Validate事件
    肯定有什么地方不对劲,呵呵
      

  10.   

    To yachong(蚜虫)  好像是控件的问题,不是只用vb带的文本框(这个好像都会触发),还用TDBText(偶尔也会触发),不过既然是文本框触发Validate事件,但似乎用cancel=true也无法阻止焦点转移到sstab上
      

  11.   

    TDBText是什么控件?没用过
    我这里实验TextBox控件cancel=true可以阻止焦点转移到sstab上
      

  12.   

    To yachong(蚜虫) 第三方文本框控件,比VB自带的文本框控件多了些功能,如自动选中文本,限制输入等