【问题标题】:SqlReader, Repeater controls and CommandArgument problemSqlReader、Repeater控件和CommandArgument问题
【发布时间】:2009-09-28 17:21:07
【问题描述】:

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

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;

    }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    【讨论】:

    • 只是一个评论:不知道数据源的类型是否可以获取 ["URL"] 值?假设将来我想将数据源更改为数据表或某些 xml 结构,难道没有办法编写 ItemDataBound 代码,因此它是不可知的并且可以与任何数据源一起使用?
    • 更新了我的答案,解释了为什么这里没有问题 - 基本上,您不是将 ItemDataBound 代码绑定到您的数据源,而是绑定到您的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多