我有一个中继器控件,可以从SqlReader生成链接列表。我试图在每个链接旁边创建一个按钮,以允许用户删除该链接。我最初的想法是在下面的Item模板中使用<%#Eval(“URL”)%>表达式。然而,ItemCommand方法中的CommandArgument总是回到空。SqlReader,Repeater控件和CommandArgument问题
<asp:Repeater ID="rptLinks" runat="server" onitemdatabound="rptLinks_ItemDataBound"
onitemcommand="rptLinks_ItemCommand">
<ItemTemplate><a href="<%# DataBinder.Eval(Container.DataItem, "URL") %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "URL") %></a><asp:ImageButton visible="false" ID="btnDeleteLink" runat="server" ImageUrl="/Images/DeleteIcon.gif" CommandName="DELETE" CommmandArgument=<%#Eval("URL") %> />
</ItemTemplate>
<SeparatorTemplate><br /></SeparatorTemplate>
</asp:Repeater>
我想接下来的事情是使用ItemDataBound事件以编程方式设置CommandArgument,但我想不出什么铸就e.Item.DataItem强制转换成这样我就可以参考[“URL” ]项目。
protected void rptLinks_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
ImageButton btnDelete;
btnDelete = (ImageButton) e.Item.FindControl("btnDeleteLink");
if (btnDelete != null)
{
btnDelete.Visible = (bool)ViewState["LinkEditing"];
string URL = ((WhatTypeGoesHere)(e.Item.DataItem))["URL"].ToString();
btnDelete.CommandArgument = URL;
}
}
只是一个评论: 在不知道数据源的类型的情况下,是否有可能得到[“URL”]值?假设将来我想将数据源更改为数据表或XML结构,是不是有办法编写ItemDataBound代码,因此它是不可知的,并且可以用于任何数据源? – Aheho 2009-09-28 17:57:51
更新了我的回答,解释了为什么这里没有问题 - 基本上,您并不是将您的ItemDataBound代码绑定到数据源,而是绑定到您的对象。 – 2009-09-28 18:36:56