【问题标题】:how to pass command argument while calling link button onclick function dynamically? (c#)如何在动态调用链接按钮 onclick 函数时传递命令参数? (C#)
【发布时间】:2010-07-07 10:27:05
【问题描述】:

我有一个要与之共享一组链接按钮的功能。 函数签名如下:

protected void FunctionName(object sender, EventArgs e)
{
 ...
}

现在我有大约 4-5 个链接按钮,用于调用相同的函数,但只是通过命令参数过滤内容,例如:

<asp:LinkButton ID="lbAll" runat="server" Text="All"
                        CommandArgument="all" OnClick="FunctionName"></asp:LinkButton>
<asp:LinkButton ID="lbTop" runat="server" Text="Top" 
                        CommandArgument="top" OnClick="FunctionName"></asp:LinkButton>
(...)

现在,我有一个下拉框,它本质上需要做同样的事情(仅在两个选定的值上),我只需要调用这个函数并将“all”或“top”参数传递给函数: "函数名"

这是在 C# 中

我试着像

那样调用那个函数
FunctionName(this, New EventArgs());

但我不知道如何传递参数?

对此有什么想法吗? 谢谢!

【问题讨论】:

    标签: c# arguments webforms


    【解决方案1】:

    使用正确的CommandArgument 传递 LinkBut​​ton,而不是 this:

    FunctionName(lbAll, EventArgs.Empty)
    

    但您确实应该使用OnCommand 事件而不是OnClickOnCommandCommandEventArgs 作为第二个参数。因此,您可以在方法中使用e.CommandArgument 获取它们。并调用方法宽度:

    FunctionName(this, new CommandEventArgs("CommandName", "CommandArgument"));
    

    【讨论】:

    • 哇,你太棒了! (让我感觉很糟糕,为什么我会想到这个!?)就像一个魅力,非常感谢!
    • 我刚刚看到了编辑的部分。是的,我认为这是一个好主意,因为它使代码面向未来,如果我碰巧重命名或删除了原始链接按钮,那么我将不得不重新做很多我的代码.. CommandName 和 Argument 似乎很完美。谢谢,现在就试试这个!
    【解决方案2】:

    为清晰起见进行编辑

    单击事件的事件处理程序将有两个参数,一个发送者和一个事件 args 对象。发送者是触发事件的对象(链接按钮)。在该事件处理程序中,您可以将发送者转换为正确的对象类型并访问其属性。

    ((LinkButton)Sender).CommandArgument
    

    使用此方法,您无需显式传递参数,只需从发件人处检索即可。

    或者(可能更好)您可以使用“OnComand”事件处理程序。在http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandargument.aspx 查找您已经在使用的属性,您将看到此事件处理程序接收到一个CommandEventArgs 参数,该参数具有一个公开CommandParameter 对象的属性。例如:

    void LinkButton_Command(Object sender, CommandEventArgs e) 
          {
             Label1.Text = "You chose: " + e.CommandName + " Item " + e.CommandArgument;
          }
    

    (来自那个 MSDN 页面)。

    【讨论】:

    • 嗯,对不起?我想调用该函数并能够将命令参数传递给它。就像在另一个函数中,FunctionName((Linkbutton)Sender).CommandArgument); - 你是这个意思吗?这听起来不太对劲!
    • @iamserious:对不起,我应该更清楚。现在完全重新编写答案以使其更有意义(并提供更多关于我迟到的想法的细节,这可能是一种更好的方法)。无论如何应该给你一些思考。
    • @iamserious:虽然我刚刚意识到我可能没有在这里回答正确的问题...... :(
    • 对不起,克里斯,我认为你误解了这个问题,我可以访问该函数内的命令参数,这是如何动态传递该参数 - 是我的问题,下面的 Hinek 建议了一个简单而好方法这样做!
    • 是的,我误解了这个问题,所以我再次回答了它。这个答案甚至不值得编辑变得更好。 ;-) 而且尽管你已经让它工作了,但我很想知道重构以使其更容易调用是否是一个不错的选择。 :)
    【解决方案3】:

    好的。我想我在最后一个答案上错过了我的观点,因为我意识到这是一个从不是那个事件的代码中的某处调用事件处理程序的问题......

    我的建议是重构事件处理程序以取出功能并将其放入一个或两个单独的方法中。例如在伪代码中:

    protected void FunctionName(object sender, EventArgs e)
    {
        if (top)
            DoTop();
        else if (all)
            DoAll();
    }
    
    private void DoTop()
    {
    //do stuff
    }
    
    private void DoAll()
    {
    //Do different stuff
    }
    

    这应该使调用您需要的代码变得非常容易。 Althoguh 我不确定我是否怀疑仅仅因为您需要它的某些功能而调用事件处理程序被认为是不好的做法。它肯定看起来比它需要的更多的工作。 :)

    您当然可以有一个方法,该方法接受一个参数,然后适当地处理它(有效地分解出 FunctionName 中的所有内容)。

    我认为这更好地回答了您的问题。如果没有,我只会回家。 ;-)

    【讨论】:

    • 嗨,克里斯,是的,如果一切都失败了,我会这样做,我只是不想复制代码,尽管这是一个非常好的主意,但它在我的场景中不起作用,因为我我在输入“if”部分之前共享几个变量,其中的代码是 if.. 所以这意味着我必须在这个调用函数中复制整个代码,这本质上是重复的代码 - 对我来说不太好。但我认为这对于简单的场景来说是一个很好的技术!非常感谢:)
    • 酷。好吧,我很高兴我的第二个答案不像第一个那么愚蠢。当然,很高兴别人给了你你想要的答案。 ;-)
    猜你喜欢
    • 2023-04-06
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多