如何在转发器的按钮单击事件处理程序中获取绑定对象?

时间:2011-12-20 15:47:01

标签: c# asp.net data-binding repeater

我有一个转发器并将对象列表绑定到它,如下所示:

List<MyClass> myList = //....
MyRepeater.DataSource = myList;
MyRepeater.DataBind();

在转发器内部,我有一个链接按钮,由此处理程序处理:

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) {
    if (e.CommandName == "Edit") {
        // I need to get my listItem.Id here
    }
}

应该很容易,但我找不到怎么做。

感谢。

3 个答案:

答案 0 :(得分:5)

如果你想要点击的实际链接按钮,那已经在object source参数中传递给了这个方法 - 只需适当地投射它。

LinkButton lb = source as LinkButton;

如果您想要转发器中的其他控件,可以使用

Button randomButton = e.Item.FindControl("buttonId") as Button;

修改

如果你想从这个行绑定的对象获得一个属性,这将是一件痛苦的事情,而且它会很难看。您需要在Session或ViewState中跨越回发来保留转发器绑定的DataSource。一旦这样做,您可以通过将其索引与单击的reeater行的索引相匹配来访问源中的相应对象,您可以通过以下方式获取该对象:

e.Item.ItemIndex

请注意,最简单的方法是将此值存储在转发器中的某个位置。

答案 1 :(得分:3)

大多数情况下,从存储/缓存/等中获取绑定对象很容易。如果你有身份证。既然你在问题“I need to get my listItem.Id here”中说过,我认为你不介意重新获取对象本身,只是想找到一种只从转发器中获取标识符的方法。

只需给按钮一个命令参数,如下所示:

<asp:LinkButton runat="server" ID="lnkEdit" CommandName="Edit"
  CommandArgument='<%# Eval("ID") %>'>Edit</asp:LinkButton>

然后就像你在问题中正确地说的那样,

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) {
  if (e.CommandName == "Edit") {
    // I need to get my listItem.Id here
    RenderEditDialog(FetchFromStorage(e.CommandArgument.ToString());
  }
}

答案 2 :(得分:2)

你不能这样做。 ASP.Net不会在回发中保留原始数据绑定对象。您必须将要保留的数据存储在转发器内的控件中。然后,您可以通过EventArgs访问控件,例如

e.Item.FindControl("myControl");