【问题标题】:C#: calling a button event handler method without actually clicking the buttonC#:调用按钮事件处理程序方法而不实际单击按钮
【发布时间】:2010-03-05 22:39:18
【问题描述】:

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

btnTest_Click(object sender, EventArgs e)

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

【问题讨论】:

    标签: c# asp.net button event-handling


    【解决方案1】:
    btnTest_Click(null, null);
    

    前提是该方法没有使用这些参数中的任何一个(通常不使用。)

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

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

    【讨论】:

    • 没有。没有太多的代码。您不应该将方法同时用于调用和事件。它具有误导性和混淆性。
    • 不,它不是自我记录的。这才是重点。如果在没有点击 btnTest 的时候触发了 btnTest_Click,那就是误导。期间。
    • 没有讨论。在未单击 btnTest 时执行 btnTest_Click 具有误导性。
    • 这里支持 Spencer,SomeSub 是关注点分离。 Spencer 并不提倡称它为SomeSub,但可能更多的是HandleUserLogin。对于维护开发人员来说,HandleUserLogin ();btnLogin_Click (null, null) 更明显,特别是如果 btnLogin_Click 不仅仅是处理用户登录!
    • “我的意思是人们写了太多代码”。更少的代码并不总是更好。在这种情况下,我必须同意@SpencerRuport。
    【解决方案2】:

    使用

    btnTest_Click( this, new EventArgs() );
    

    【讨论】:

    • EventArgs.Empty 是新 EventArgs() 的静态。所以 EventArgs.Empty 更合适,但创建新的几乎一样好。
    【解决方案3】:

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

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

    MethodInfo clickMethodInfo = typeof(Button).GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);
    
    clickMethodInfo.Invoke(buttonToInvoke, new object[] { EventArgs.Empty });
    

    【讨论】:

      【解决方案4】:

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

      btnTest.PerfromClick();
      

      【讨论】:

        【解决方案5】:

        如果该方法没有使用 sendere可以调用:

        btnTest_Click(null, null);
        

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

        【讨论】:

          【解决方案6】:

          它只是表单上的一个方法,您可以像调用任何其他方法一样调用它。您只需要创建一个 EventArgs 对象来传递给它,(并将按钮的句柄作为sender 传递给它)

          【讨论】:

            【解决方案7】:

            只需调用:

            btnTest_Click(null, null);
            

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

            【讨论】:

              【解决方案8】:

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

              imagebutton_Click((ImageButton)this.divXXX.FindControl("imagbutton"), EventArgs.Empty);
              

              如果你在其中保存一些东西,你可以使用按钮状态,例如 imagebutton 的 commandArgument。

              【讨论】:

                【解决方案9】:

                btnTest_Click(new object(), EventArgs.Empty)

                【讨论】:

                • 传递一个通用对象似乎是个坏主意。最好传递按钮或null。
                • @John 你为什么会有这种感觉?
                • 因为发送者通常是控件,所以如果点击处理程序使用它,它会期望sender as Control会起作用。
                • (sender as Control) 如果您传入一个对象,将返回 null,因此该参数不起作用。我的反驳论点是,通过传入一个 null,您会破坏使用 (sender.GetType) 来检查类型的代码。
                【解决方案10】:

                您可以像调用任何其他函数一样调用 btnTest_Click。

                最基本的形式是这样的:

                btnTest_Click(this, null);
                

                【讨论】:

                  【解决方案11】:
                  btnSubmit_Click(btnSubmit,EventArgs.Empty);
                  

                  【讨论】:

                  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案 - From Review
                  【解决方案12】:

                  您必须传递参数sendere 来调用.cs 文件中的按钮事件处理程序

                  btnTest_Click(sender,e);
                  

                  【讨论】:

                    【解决方案13】:
                    btnTest.Click +=new EventHandler(btnTest_Click)
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2017-07-15
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多