sxyweiren 发表于 2014-1-7 14:18:00

关于ImText的Leave事件和Button的MouseDown事件触发顺序的问题

在VB6的Source里,如果鼠标左键单击“取消”按钮,会取消ImText的Leave事件。
比如:
Private Sub cmdExit_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
      bolCancelf = True
    End If
End Sub
Private Sub imt_Test_LostFocus()
    If bolCancelf = True Then
    Else
      ...
    End IF
Exit Sub

但是移行到VB.net的时候,会先触发LostFocus事件,然后才触发MouseDown事件。这样的话会多走一些逻辑,造成VB6跟VB.net的效果不一致了。

这个问题如何解决?

linnerchen 发表于 2014-1-7 15:32:00

事件的顺序遵循.net标准,所以你应当对的你代码做出修改,在button的click或MouseDown事件里处理你的逻辑。

sxyweiren 发表于 2014-1-8 09:05:00

回复 2楼linnerchen的帖子

但是那样的话我的光标从InputMan里面离开的处理就没了。

Leo 发表于 2014-1-8 16:35:00

那个啥,我猜测按照你的代码的写法,在 InputMan 控件的 LostFocus 事件里面,你是期望做这样的逻辑判断:如果用户按下了 Cancel 按钮,我就什么都不处理,否则处理一些诸如值校验的逻辑,对么?

sxyweiren 发表于 2014-1-10 16:28:00

回复 4楼Leo的帖子

对,就是这个想法。。。

Leo 发表于 2014-1-10 17:52:00

.NET 提供了另一套解决方案叫做 Validation。
你看看这个模型适合不?
Public Class Form1

    Dim _cancelButtonClick = False

    Protected Overrides Sub OnLoad(e As EventArgs)
      MyBase.OnLoad(e)
      ' Cancel Button.
      Me.Button1.CausesValidation = False
    End Sub

    Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
      Debug.WriteLine(e.Cancel)
    End Sub

    Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
      If (_cancelButtonClick) Then
            Return
      Else
            ' Do your validation logic here.
      End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      _cancelButtonClick = True
      Me.Close()
      _cancelButtonClick = False
    End Sub
End Class
页: [1]
查看完整版本: 关于ImText的Leave事件和Button的MouseDown事件触发顺序的问题