SqlReader,Repeater控件和CommandArgument问题

时间:2009-09-28 17:21:08

标签: c#

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

    }
}

1 个答案:

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