C# SqlReader、Repeater控件和CommandArgument问题

C# SqlReader、Repeater控件和CommandArgument问题,c#,C#,我有一个repeater控件,它从SqlReader生成链接列表。我试图在每个链接旁边创建一个按钮,允许用户删除该链接。我最初的想法是在项目模板中使用表达式,如下所示。但是,ItemCommand方法中的CommandArgument始终返回为空 <asp:Repeater ID="rptLinks" runat="server" onitemdatabound="rptLinks_ItemDataBound" onitemcommand="rptLi

我有一个repeater控件,它从SqlReader生成链接列表。我试图在每个链接旁边创建一个按钮,允许用户删除该链接。我最初的想法是在项目模板中使用表达式,如下所示。但是,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>

您可以将
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
(虽然不是真的,因为
DbDataReader
实现了
IEnumerable
的非泛型版本)。

您可以将
数据项
强制转换到读取器继承链中实现
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
(虽然不是真的,因为
DbDataReader
实现了
IEnumerable
的非通用版本)。

只是一个注释:不知道数据源的类型就可以获取[“URL”]值吗?假设将来我想将数据源更改为datatable或某种xml结构,是否有办法编写ItemDataBound代码,使其不可知,并可用于任何数据源?更新了我的答案,以解释为什么这里没有问题-基本上,您没有将ItemDataBound代码绑定到数据源,但是对于您的对象,只是一个注释:在不知道数据源类型的情况下,难道不可能获取[“URL”]值吗?假设将来我想将数据源更改为datatable或某种xml结构,是否有办法编写ItemDataBound代码,使其不可知,并可用于任何数据源?更新了我的答案,以解释为什么这里没有问题-基本上,您没有将ItemDataBound代码绑定到数据源,而是绑定到对象。