我有一个转发器并将对象列表绑定到它,如下所示:
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
}
}
应该很容易,但我找不到怎么做。
感谢。
答案 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");