将LinkButton的OnClick事件设置为codebehind中的方法

15

我从代码后台构建了一个LinkButton,我需要将onclick分配给一个方法,并将一个参数传递给它。到目前为止,我有:

LinkButton lnkdel = new LinkButton();
lnkdel.Text = "Delete";

我想要传递的方法看起来像这样:

 protected void delline(string id)
        {

        }
2个回答

34

你不能直接将它传递给那个方法,你需要将点击事件委托分配给一个能够处理它的方法。

就像这样:

public void DynamicClick(object sender, EventArgs e) {
    // do something
}

像任何事件一样分配点击事件:

lnkdel.Click += new EventHandler(DynamicClick);

如果你想要传递一个参数,使用 CommandArgument,并且需要使用不同的委托:

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

然后:

lnkDel.Command += new CommandEventHandler(DynamicCommand)
lnkDel.CommandArgument = 1234;

顺便说一下,如果你使用的是 C#3 或更高版本,你也可以使用匿名方法的酷炫功能:

lnkDel.Command += (s, e) => { 
   Label1.Text = "You chose: " + e.CommandName + " Item " + e.CommandArgument;
};

谢谢伙计,我正在尝试使用你发布的第二种方法,因为这篇文章的目的是通过传递ID进行删除。OnCommand没有出现在智能感知列表中,当我尝试输入它时,它告诉我LinkButton由于其保护级别而无法访问。 - Chris
1
@Chris - 是的,忘记了LinkButton的那个“bug/feature”。试试这个:lnkDel.Command += new CommandEventHandler(DynamicCommand) 或者只是 lnkDel.Command += DynamicCommand - RPM1984
谢谢伙计,它可以编译但似乎从来没有进入 Command - 我是不是漏掉了什么?我也尝试过使用 C#3 方法,它也可以编译,但同样不会进入那个方法。 - Chris
2
动态创建控件存在许多问题。这是我的建议,首先将常规的LinkButton添加到页面上(非动态的,将其添加到ASPX/ASCX中),并像上面那样从代码后台设置命令(不要新建按钮,只需设置命令/命令参数)。看看它是否有效。如果有效,那么您可能遗漏了一些动态控件的内容 - 比如在PostBack时未重新创建控件等。 - RPM1984
2
请注意 - 动态创建的控件需要在 postback 时重新创建(在 Page_Load 事件中)。你是否这样做了?如果由于某种原因无法在 Page_Load 中设置 commandargument,则需要将 commandargument 存储在 viewstate 中。这种情况可能会变得非常混乱。 - RPM1984

2

此事件的函数原型为:

protected void lnkdel_OnClick(object _sender, EventArgs _args)
{
    LinkButton src = (LinkButton)_sender;
    // do something here...
}

使用以下方法进行分配:

LinkButton lnkdel = new LinkButton();
lnkdel.Text = "Delete";
lnkdel.OnClick += new EventHandler(lnkdel_OnClick);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接