2009-09-28 58 views
0

我有一个中继器控件,可以从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; 

    } 
} 

回答

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的非通用版本)。

+0

只是一个评论: 在不知道数据源的类型的情况下,是否有可能得到[“URL”]值?假设将来我想将数据源更改为数据表或XML结构,是不是有办法编写ItemDataBound代码,因此它是不可知的,并且可以用于任何数据源? – Aheho 2009-09-28 17:57:51

+0

更新了我的回答,解释了为什么这里没有问题 - 基本上,您并不是将您的ItemDataBound代码绑定到数据源,而是绑定到您的对象。 – 2009-09-28 18:36:56