Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:调用按钮事件处理程序方法而不实际单击按钮_C#_Asp.net_Button_Event Handling - Fatal编程技术网

C#:调用按钮事件处理程序方法而不实际单击按钮

C#:调用按钮事件处理程序方法而不实际单击按钮,c#,asp.net,button,event-handling,C#,Asp.net,Button,Event Handling,我的aspx文件中有一个名为btnTest的按钮。.cs文件具有一个在单击按钮时调用的函数 btnTest_Click(object sender, EventArgs e) 如何从代码中调用此函数(即,不实际单击按钮) 假设该方法不使用这两个参数中的任何一个(通常不使用) 老实说,虽然这很讨厌。如果您有需要调用的代码,则应遵循以下约定: protected void btnTest_Click(object sender, EventArgs e) { SomeSub(); } pr

我的aspx文件中有一个名为btnTest的按钮。.cs文件具有一个在单击按钮时调用的函数

btnTest_Click(object sender, EventArgs e)
如何从代码中调用此函数(即,不实际单击按钮)

假设该方法不使用这两个参数中的任何一个(通常不使用)

老实说,虽然这很讨厌。如果您有需要调用的代码,则应遵循以下约定:

protected void btnTest_Click(object sender, EventArgs e)
{
   SomeSub();
}

protected void SomeOtherFunctionThatNeedsToCallTheCode()
{
   SomeSub();
}

protected void SomeSub()
{
   // ...
}

btnTest\u Click(new object(),EventArgs.Empty)

您可以像调用任何其他函数一样调用btnTest\u Click

最基本的形式是:

btnTest_Click(this, null);

如果该方法未使用
sender
e
,则可以调用:


您可能要考虑的是将该方法中的代码提取到它自己的方法中,您可以从按钮单击事件处理程序和代码中的任何其他位置调用该函数。

< P>这只是您的窗体上的一种方法,您可以将其称为任何其他方法。您只需创建一个EventArgs对象来传递给它(并将按钮句柄作为
发送者传递给它)

使用

btnTest_Click( this, new EventArgs() );
简单地说:

btnTest_Click(null, null);

只需确保您没有尝试在函数中使用任何一个参数。

在第一个按钮事件中调用第二个按钮(imagebutton)事件:


如果将某些内容保存到按钮状态中,则可以使用按钮状态,例如imagebutton的commandArgument。

以上所有方法都不好,因为您可能会更改事件函数名。最简单的是:

btnTest.PerfromClick();

您可以使用反射来调用
OnClick
方法,该方法将触发click事件处理程序

我觉得这是肮脏的张贴,但它的工作

MethodInfo clickMethodInfo = typeof(Button).GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);

clickMethodInfo.Invoke(buttonToInvoke, new object[] { EventArgs.Empty });

您必须将参数
sender
e
传递给.cs文件中的调用按钮事件处理程序

btnTest_Click(sender,e);

传递泛型对象似乎是个坏主意。传递按钮或null更好。@John为什么这样认为?因为发送者通常是控件,所以如果单击处理程序使用它,它会期望
发送者作为控件
可以工作。
(发送者作为控件)
如果传递对象,将返回null,因此该参数不起作用。我的反参数是,通过传入null,您可以中断使用
(sender.GetType)
检查类型的代码。否。没有太多的代码。您不应该对调用和事件同时使用方法。这是误导和混淆的。至于异常处理,它取决于许多因素,远远超出了这个问题的范围。不,它不是自我记录的。这就是重点。如果btnTest\u Click在未单击btnTest时被触发,则会产生误导。没有讨论。在没有点击btnTest的情况下让btnTest\u Click execute是一种误导。在这里,与Spencer站在一边,SomeSub是一种关注点分离。斯宾塞并不提倡将其称为
SomeSub
,但可能更提倡
HandleUserLogin
。维护开发人员更容易看到:
HandleUserLogin()
而不是
btnLogin\u单击(null,null)
,特别是如果
btnLogin\u单击
不仅仅处理用户的登录!Empty是新EventArgs()的静态值。因此EventArgs.Empty更合适,但创建新的也差不多。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或文档链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑你的答案-
btnTest.PerfromClick();
MethodInfo clickMethodInfo = typeof(Button).GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);

clickMethodInfo.Invoke(buttonToInvoke, new object[] { EventArgs.Empty });
btnTest.Click +=new EventHandler(btnTest_Click)
btnSubmit_Click(btnSubmit,EventArgs.Empty);
btnTest_Click(sender,e);