Vb.net 区分按钮是否为';s click事件是由用户操作或代码触发的

Vb.net 区分按钮是否为';s click事件是由用户操作或代码触发的,vb.net,winforms,Vb.net,Winforms,当用户单击此控件时,将触发按钮的单击事件。 但此事件可以通过代码触发,例如: myButton_Click(myButton, EventArgs.Empty) 如何区分这两种情况 谢谢大家! 如前所述,除了通过反射检查堆栈跟踪之外,您可能运气不好 现在,您可以通过创建一个新的子对象来重构它,该子对象使用一个额外的参数来执行实际工作,该参数将告诉您它是如何被按下的。事件处理程序可以调用新的sub并传递一个表示它是通过事件触发的值,而另一个“手动”调用可以传递一个表示它是由代码调用的值。然后,新

当用户单击此控件时,将触发按钮的单击事件。 但此事件可以通过代码触发,例如:

myButton_Click(myButton, EventArgs.Empty)
如何区分这两种情况


谢谢大家!

如前所述,除了通过反射检查堆栈跟踪之外,您可能运气不好


现在,您可以通过创建一个新的子对象来重构它,该子对象使用一个额外的参数来执行实际工作,该参数将告诉您它是如何被按下的。事件处理程序可以调用新的sub并传递一个表示它是通过事件触发的值,而另一个“手动”调用可以传递一个表示它是由代码调用的值。然后,新sub可以查看该值并采取它需要的任何操作。

当您以编程方式调用它时,将其他内容作为发送方或参数传递

enter code here
myButton_Click("I called it",null);

myButton_Click(object sender, RoutedEventArgs e)
{
   //Check the value of sender here
   if(sender.ToString() == "I called it" )
   {
       //You know you called it 
   }
}

创建一个执行该工作的方法,并从
单击
事件和/或从代码中的任何其他地方调用它,不是更容易吗

Private Sub DoTheThing(ByVal calledFromCode as boolean, ByVal sender as object)
    'Do the work here
End Sub

Private Sub myButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    DoTheThing(false, sender)
End Sub

Private Sub SomeOtherMethod()
    DoTheThing(true, myButton)
End Sub

创建一个从RoutedEventArgs派生的新类,并在调用处理程序时传递该类

    public class MyExtendedRoutedEventArgs : RoutedEventArgs
{
   public bool ICalled {set;get;}
}

MyButton_Click(MyButton, new ExtendedRoutedEventArgs(){ICalled=true});

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    if(e.getType() == typeof(MyExtendedRoutedEventArgs)
    {
        //you called it
    }
}

看一看,一个有4个答案的问题,投下2票。我不明白,谢谢。但情况有点复杂。我有另一个事件,比如说Event2,当按钮的click事件被执行时被触发。但即使没有按钮的单击事件,也可以触发此event2。如果这种情况是真的,那么在event2按钮内部的click事件将从代码中调用。因此,通风口是相互依赖的,我找不到其他方法,只能区分单击事件是由用户单击还是由代码触发的。如果您确实迫切需要解决方案,您可以通过编程方式检查stacktrace以找到调用帧(如果需要,请后退多帧)查看调用是源于代码还是来自框架内部。“真正的”按钮点击应该来自.NET框架内部。除非你别无选择,否则我真的不建议你这么做,这是一个非常丑陋的黑客行为。好吧,但我需要发送者作为对象,因为我使用了它的一些属性和.tag值。您能否解释一下,在不更改发件人但使用一些参数的情况下如何执行此操作?myButton.(属性),除非您对多个按钮使用相同的处理程序。只要您仅对一个按钮使用
myButton\u Click
方法,您可以通过控件名称直接访问该控件,而无需使用
sender
变量。我正在对多个按钮使用中心单击事件使用argsThank you查看新答案,但正如我在上面的注释中所解释的,情况有点复杂。我有另一个事件,比如说Event2,当按钮的click事件被执行时被触发。但即使没有按钮的单击事件,也可以触发此event2。如果这种情况是真的,那么在event2按钮内部的click事件将从代码中调用。因此,事件是相互依赖的,我找不到其他方法,只能区分单击事件是由用户单击触发的还是由代码触发的。对不起,我真的不明白。你有两个项目。如果用户单击
myButton
Event1
被激发,此方法调用
Event2
方法。但是,如果您在代码中的某个地方调用了
Event2
,则此方法必须调用
Event1
——而无需再次调用
Event2
?我只有两个事件:按钮的单击事件和Event1。当用户单击按钮时触发Event1。在这种情况下,我需要一种不在event1中运行某些代码的方法。Event1可以通过另一种方式触发,而不是通过用户单击按钮。在这种情况下,在某个点上,按钮的单击事件由代码调用。但如果是这种情况,在button的click事件中,我需要一种防止某些代码运行的方法。因此,正如您所看到的,所有这些都取决于按钮的事件是由代码或用户触发的事实。令人困惑的是,当您说您有
按钮单击
事件和
事件1
,但
事件1
是在用户单击按钮时触发的。
Event1
是否真的与
按钮绑定?单击
事件(作为
私有子事件1(作为对象的ByVal sender,作为事件args的ByVal e)处理某些按钮。单击
)?或者你这样说是因为你调用了
Event1
方法
myButton\u点击
?无论如何,我认为您应该使用两个事件中的代码编辑您的问题,并显示您希望如何调用它们的示例。不,当用户单击按钮时会触发Event1,因为按钮单击事件中的代码会导致触发Event1。谢谢,我理解您的代码。但是,是否可以不使用您的类,而是使用以下想法:当我从代码中调用按钮的click事件时,我使用以下指令:myButton\u click(myButton,EventArgs.Empty)现在当此事件从真实用户单击中激发时,EventsArg是否为空?因为if不是空的,我可以在click事件中测试eventArgs是否为空?这个主意行得通吗?非常感谢。您可以将null作为第二个参数传递,并在处理程序中检查null。如果(e==null)但是,扩展该类的好处是,您可以向MyExtendeDrowedEventArgs添加任何想要的属性,并在处理程序中检查这些属性。我现在这样做了,因为我正在测试一些东西。但这似乎是唯一的解决办法。