繁体   English   中英

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

[英]How to get bound object in a repeater's button click event handler?

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

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
    }
}

这应该很容易,但是我找不到如何做。

谢谢。

如果要单击实际的链接按钮,则已经在object source参数中将其传递给了此方法,只需对其进行适当的转换即可。

LinkButton lb = source as LinkButton;

如果您需要中继器中的其他控件,则可以使用

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

编辑

如果要从该行绑定到的对象获取属性,这将是一件很麻烦的事,而且很丑陋。 您需要在Session或ViewState中持久保存转发器绑定的数据源。 完成此操作后,可以通过将源的索引与单击的重复播放器的行的索引进行匹配来访问源中的适当对象,您可以通过以下方法获得:

e.Item.ItemIndex

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

在大多数情况下,从存储/缓存/等中获取绑定的对象很容易。 如果您有ID。 既然您在问题中说“ 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());
  }
}

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

e.Item.FindControl("myControl");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM