区分按钮的click事件是从用户操作还是从代码触发

时间:2015-04-06 16:34:05

标签: vb.net winforms

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

myButton_Click(myButton, EventArgs.Empty)

我如何区分这两种情况?

谢谢!

4 个答案:

答案 0 :(得分:1)

创建一个派生自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
    }
}

答案 1 :(得分:0)

正如所写,如果没有通过反射检查堆栈跟踪,你可能会运气不好。

现在你/可以/通过创建一个新的子实体来重构它,它使用一个额外的参数来实际工作,该参数将告诉你它是如何被按下的。事件处理程序可以调用new sub并传递一个值,表示它是通过事件触发的,另一个是" manual" call可以传递一个值,表示它已被您的代码调用。然后,新子可以查看值并采取它需要的任何操作。

答案 2 :(得分:0)

当您以编程方式调用它时,将其他内容作为发件人或args传递。

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 
   }
}

答案 3 :(得分:0)

创建一个完成工作的方法并从Click事件和/或代码中的任何其他位置调用它会更容易吗?

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