我有一个转发器控件,可以从SqlReader生成一个链接列表。我正在尝试在每个链接旁边创建一个按钮,允许用户删除该链接。我原来的想法是使用<%#Eval(“URL”)%>项目模板中的表达式如下所示。但是,ItemCommand方法中的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”] Item。 / p>
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;
}
}
答案 0 :(得分:3)
您可以将DataItem
转换为您的阅读器继承链中实现IDataRecord
的任何类:
// You could also cast to SqlDataReader, DbDataReader, or IDataReader
string URL = ((IDataRecord)(e.Item.DataItem))["URL"].ToString();
数据读取器有点令人困惑,因为从DbDataReader
继承的对象既可以作为数据源(通过其IEnumerable
的实现),也可以作为表示数据的对象(通过其实现IDataRecord
)。
IDataRecord
界面提供对数据读取器记录的列值的访问(通过Item
属性和各种Get
*方法)。
换句话说,就像你绑定到IEnumerable<IDataRecord>
一样(虽然不是真的,因为DbDataReader
实现了IEnumerable
的非通用版本。)