Vb.net VB:如何手动调用或延迟事件?

Vb.net VB:如何手动调用或延迟事件?,vb.net,event-handling,Vb.net,Event Handling,背景:我是vb新手,来自javascript 我的任务是使用txtBox.LostFocus事件进行一些验证。问题是,如果用户想要按三个按钮中的任意两个,我需要取消验证步骤 说明: 代码 我曾尝试将two button的GotFocus事件添加到输入框的LostFocus事件处理程序中,但在循环中多次触发该事件时出现了错误 例如: 这些尝试是完全错误的,但从javascript背景来看,尽管也完全错误,我可以破解类似的东西 ... (assume same element structure f

背景:我是vb新手,来自javascript

我的任务是使用txtBox.LostFocus事件进行一些验证。问题是,如果用户想要按三个按钮中的任意两个,我需要取消验证步骤

说明:

代码

我曾尝试将two button的GotFocus事件添加到输入框的LostFocus事件处理程序中,但在循环中多次触发该事件时出现了错误

例如:

这些尝试是完全错误的,但从javascript背景来看,尽管也完全错误,我可以破解类似的东西

... (assume same element structure from vb)
var eventQueue = [];
var userIntentDetected = false;

txtInputBox.addEventListener("blur", function(event){

  // Set a timeout to manually trigger the last event's click method in the eventQueue
  setTimeout(function(){
    if (eventQueue.length > 0 && userIntetDetected)
      runIntendedHandler(eventQueue[eventQueue.length -1]);
  }, 500);
})

// Both event listeners listen for click and stop default actions,
// set intent boolean to true, and add it's event object to a queue
btnExit.addEventListener("click", function(event){
  event.preventDefault();
  userIntentDetected = true;
  eventQueue.push(event);
});

btn.addEventListener("click", function(event){
  event.preventDefault();
  userIntentDetected = true;
  eventQueue.push(event);
});

// Validation should occur only if the user moves focus to an element 
// that IS NOT either the btnExit or btnClear
function runIntendedHandler(event){
  if (event.target.id = "btnExit")
    // run exit functions
    code...
  else if (event.target.id = "btnClear")
    // run clear functions
    code..

  userIntentDetected = false;
}
在vb中处理事件的正确方法是什么?在触发操作之前,如何检测队列中的下一个事件?这份声明有帮助吗

更新3:答案比我想象的要简单得多。显然,您可以使用btn.Focused属性从TXInputBox.LostFocus事件处理程序中检查元素的下一个焦点。。。算了吧

更新2:关于到底需要什么,有很多困惑,其中很多都是我在描述验证子例程时的错误。我已经更改了一些元素的名称,并添加了一个图像来总结我的导师给我的所有信息

更新1:@TnTinMn提供了最接近的工作答案,只需稍加修改即可使用。 示例如下:

Private LastActiveControl As Control = Me   ' initialize on form creation

Protected Overrides Sub UpdateDefaultButton()
    ' Just added an IsNot condition to stay inline with the requirements
    If (LastActiveControl Is txtNumberOfDrinks) AndAlso
        ((ActiveControl Is btnClear) OrElse (ActiveControl Is btnExit)) Then

        Console.WriteLine("Your intent to press either btnClear or btnExit has been heard...")

    ' Validation happens only if the user didn't intend to click btnClear or btnExit 
    ElseIf (LastActiveControl Is txtNumberOfDrinks) AndAlso
    ((ActiveControl IsNot btnClear) OrElse (ActiveControl IsNot btnExit)) Then

        Console.WriteLine("You didn't press either btnClear or btnExit.. moving to validation")

        validateForm()
    End If

    LastActiveControl = ActiveControl   ' Store this for the next time Focus changes

End Sub

谢谢大家!

Winform的事件顺序充其量也是混乱的。有关摘要,请参阅

假设我正确地解释了您的目标,我不会响应txtInputBox.LostFocus事件,而是重写一个鲜为人知的表单方法,名为。当Form.ActiveControl属性更改时,将调用此方法,并有效地为您提供ActiveControl更改的伪事件。如果新的ActiveControl是一个按钮,则此方法也会在该按钮之前执行。引发Click事件

由于您只想在焦点从txInputBox更改为btnPromptForName或btnExit时调用验证代码,因此您可以通过以下方式完成此操作

Public Class Form1

    Private LastActiveControl As Control = Me   ' initialize on form creation

    Protected Overrides Sub UpdateDefaultButton()
        If (LastActiveControl Is tbInputBox) AndAlso
            ((ActiveControl Is btnPromptForName) OrElse (ActiveControl Is btnExit)) Then
            ValidateInput()
        End If

        LastActiveControl = ActiveControl   ' Store this for the next time Focus changes

    End Sub

    Private Sub ValidateInput()
      Console.WriteLine("You're either intending to prompt for name or exit")
    End Sub

    Private Sub btnPromptForName_Click(sender As Object, e As EventArgs) Handles btnPromptForName.Click
        Console.WriteLine("btnPromptForName_Click clicked")
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Console.WriteLine("btnExit clicked")
    End Sub

End Class

编辑:我忘了提到,因为UpdateDefaultButton在引发Button.Click事件之前运行,所以只有在验证成功的情况下才能连接Click事件处理程序。然后将事件处理程序作为按钮的一部分删除。单击处理程序代码。

看起来解决方案比我想象的简单得多。培训师的方法是检查TXInputBox.LostFocus事件处理程序中的备用btn.Focused属性,例如:

' When the user moves focus away from the textbox
Private Sub txtInputBox_LostFocus(sender As Object, e As EventArgs) _
  Handles txtIputBox.LostFocus

    ' Check if the clear or exit button is focused before validating
    ' Validate only if btnClear and also btnExit IS NOT focused

    If Not btnExit.Focused AndAlso Not btnClear.Focused Then
        Call validateForm()
    End If
End Sub

感谢您的支持,并为我展示了追踪赛事的另一种方式。这也非常有用。

通常在winforms land中,您不会取消验证。您使其发生得如此之快,以至于用户不会被延迟,或者直到用户实际尝试某个操作时才进行验证。意图并不重要。我不知道为什么这个任务的性质是这样的,但方向是明确的,所以这是我挖的兔子洞。在顶部声明中,您正在制作3个按钮,但试图将它们分配为字符串-打开选项Strict on并快速查看错误。通常,这些代码应该在设计器中生成。@有一天,这个示例主要是伪代码。元素是通过设计器放置在表单上的,所以这个示例只是简单介绍了正在发生的事情。在这个例子中,我会尽量更明确一些。这个例子主要是伪代码。你在寻找一个伪答案吗?这正是我正在寻找的解决方案。另外,当我运行这个程序时,当从文本框中切换时,它会尝试验证两次。我不知道为什么您会看到验证代码运行了两次。UpdateDefaultButton仅在ActiveControl更改时运行一次,这是此方法的全部前提。你的链接代码显示了第二个条件,与我从你的问题中推断的意图相反。由于许多其他人在理解你的意图方面有困难,我对此并不感到惊讶。如果这项技术解决了你的问题,考虑把它标记为答案,这样别人就不会浪费时间来解决你的问题,当你有一个满意的解决方案。谢谢你的答复。对不起,方向不清楚,但我尽量说清楚。最初的帖子提到我需要在用户点击两个按钮中的任何一个时取消验证,所以不确定困难来自何方。我等待另一个答案的原因是,最初我要求提供一个使用txtBox.LostFocus的解决方案,该解决方案可以完全按照您提供的方式执行,但您的解决方案运行得非常好。对于示例伪代码,我认为这已经足够清楚了,但我对这种语言了解不够,无法用文字表达我想要的内容。谢谢!
Public Class Form1

    Private LastActiveControl As Control = Me   ' initialize on form creation

    Protected Overrides Sub UpdateDefaultButton()
        If (LastActiveControl Is tbInputBox) AndAlso
            ((ActiveControl Is btnPromptForName) OrElse (ActiveControl Is btnExit)) Then
            ValidateInput()
        End If

        LastActiveControl = ActiveControl   ' Store this for the next time Focus changes

    End Sub

    Private Sub ValidateInput()
      Console.WriteLine("You're either intending to prompt for name or exit")
    End Sub

    Private Sub btnPromptForName_Click(sender As Object, e As EventArgs) Handles btnPromptForName.Click
        Console.WriteLine("btnPromptForName_Click clicked")
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Console.WriteLine("btnExit clicked")
    End Sub

End Class
' When the user moves focus away from the textbox
Private Sub txtInputBox_LostFocus(sender As Object, e As EventArgs) _
  Handles txtIputBox.LostFocus

    ' Check if the clear or exit button is focused before validating
    ' Validate only if btnClear and also btnExit IS NOT focused

    If Not btnExit.Focused AndAlso Not btnClear.Focused Then
        Call validateForm()
    End If
End Sub