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

xbo*_*nez 21 c# asp.net button event-handling

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

btnTest_Click(object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)

如何从我的代码中调用此函数(即没有实际单击按钮)?

Spe*_*ort 29

btnTest_Click(null, null);
Run Code Online (Sandbox Code Playgroud)

前提是该方法不使用这些参数中的任何一个(这是非常常见的.)

说实话虽然这很狡猾.如果您有需要调用的代码,则应遵循以下约定:

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

protected void SomeOtherFunctionThatNeedsToCallTheCode()
{
   SomeSub();
}

protected void SomeSub()
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 不,没有太多的代码.您不应该为调用和事件使用方法.这是误导和混乱. (14认同)
  • 在这里与斯宾塞站在一起,SomeSub是一个关注点的分离.斯宾塞并不主张称之为"SomeSub",但可能更多的是"HandleUserLogin".维护开发人员更明显地看到:`HandleUserLogin();`比`btnLogin_Click(null,null)`,特别是如果`btnLogin_Click`不仅仅处理用户的登录! (5认同)
  • 没有讨论.在没有点击btnTest时执行btnTest_Click会产生误导. (4认同)
  • 不,它不是自我记录的.这才是重点.如果btnTest_Click在没有点击btnTest的时候被触发,那就是误导.期. (2认同)
  • “我的观点是人们写了太多代码”。代码越少并不总是越好。在这种情况下,我必须同意@SpencerRuport。 (2认同)

JDM*_*DMX 18

使用

btnTest_Click( this, new EventArgs() );
Run Code Online (Sandbox Code Playgroud)

  • `EventArgs.Empty`? (4认同)
  • EventArgs.Empty是新EventArgs()的静态.所以EventArgs.Empty更合适,但创建新的几乎同样好. (3认同)

maj*_*tor 6

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

btnTest.PerfromClick();
Run Code Online (Sandbox Code Playgroud)


ywm*_*ywm 5

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

我觉得发布这个很脏但是有效......

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

clickMethodInfo.Invoke(buttonToInvoke, new object[] { EventArgs.Empty });
Run Code Online (Sandbox Code Playgroud)