【问题标题】:Binding DataTable to Repeater将 DataTable 绑定到中继器
【发布时间】:2019-02-26 02:09:24
【问题描述】:

我已经尝试了所有我能在网上找到的文章组合,并且在这一点上拔出我的头发。下面的代码似乎甚至没有尝试数据绑定..当“抛出异常”行没有被注释时,它不会抛出异常。

我尝试只传递 DataTable IEnumerable 而不是数据表/数据行,但我得到“DataBinding:'System.Data.DataTable' 不包含名为 'dateCompleted' 的属性。”

任何形式的帮助将不胜感激......

C#

protected void runReportForUser(Guid UserID)
    {
        pnCard.Visible = true;
        pnNoPoints.Visible = false;

        using (var db = new db())
        {
            // scorecard logic

            var u = userProfile.get(UserID);

            var t = db.Database.SqlQuery<DataTable>("exec ReturnEntities '" + u.userID + "'").FirstOrDefault();
            //rptEvents.DataSource = t.ToArray()[0];

            rptEvents.DataSource = t.Rows;
            //rptEvents.DataSource = t;   

            rptEvents.DataBind();

        }
    }


protected void rptEvents_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            //throw new Exception("Test")
            DataRow dr = (DataRow)e.Item.DataItem;

            ((Label)e.Item.FindControl("lblDate")).Text = dr[0].ToString();
            //((Label)e.Item.FindControl("lblDate")).Text = DataBinder.Eval(e.Item.DataItem, "dateCompleted").ToString();
            ((Label)e.Item.FindControl("lblCategory")).Text = dr[1].ToString();
            ((Label)e.Item.FindControl("lblName")).Text = dr[2].ToString();
            ((Label)e.Item.FindControl("lblPointsValue")).Text = dr[3].ToString();

        }
    }

ASPX:

 <table width="100%" cellpadding="0" cellspacing="0" border="0">
        <tr>
            <th>Date</th>
            <th>Category</th>
            <th>Points Earned</th>
        </tr>
        <asp:Repeater ID="rptEvents" runat="server" OnItemDataBound="rptEvents_ItemDataBound">
            <ItemTemplate>
                <tr id="trEvents" runat="server">
                    <td><asp:Label ID="lblDate" runat="server" /></td>
                    <td><asp:Label ID="lblCategory" runat="server" /></td>
                    <td><asp:Label ID="lblName" runat="server" /></td>
                    <td><asp:Label ID="lblPointsValue" runat="server" /></td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </table>

【问题讨论】:

  • if 语句很可能不匹配?如果在 if 语句之前插入一条语句呢?
  • 我注释掉了 if 语句来测试它,它仍然产生了相同的结果。
  • 你试过调试吗?我很好奇在您执行 DataBind 之前 t.Rows 的计数是多少。
  • 根据我的尝试,我要么得到正确的行数,要么得到 0。现在我考虑了一下,这 0 可能是代码没有在数据绑定中运行的原因。

标签: c# asp.net data-binding datatable repeater


【解决方案1】:

在尝试了很多不同的事情之后,我终于弄明白了。我最终不得不将其列为与表结构匹配的用户定义类的列表。看起来下面的任何一种绑定方式都有效。

这是以防万一:

protected void runReportForUser(Guid UserID)
    {
        pnCard.Visible = true;
        pnNoPoints.Visible = false;

        using (var db = new db())
        {
            // scorecard logic

            var u = userProfile.get(UserID);

            var t = db.Database.SqlQuery<EntityHistory>("exec dbo.ReturnEntities '" + u.userID.ToString() + "'");
            List<EntityHistory> EntityList = t.ToList<EntityHistory>();
            rptEvents.DataSource = EntityList;
            rptEvents.DataBind();

        }
    }

protected void rptEvents_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
        EntityHistory EH = (EntityHistory)e.Item.DataItem;
            ((Label)e.Item.FindControl("lblDate")).Text = EH.dateCompleted;
            ((Label)e.Item.FindControl("lblCategory")).Text = DataBinder.Eval(e.Item.DataItem, "Category").ToString();
            ((Label)e.Item.FindControl("lblName")).Text = DataBinder.Eval(e.Item.DataItem, "Name").ToString();
            ((Label)e.Item.FindControl("lblPointsValue")).Text = DataBinder.Eval(e.Item.DataItem, "MaxPointsEach").ToString();
        }
    }

public class EntityHistory
{
    public Guid UserID { get; set; }
    public String dateCompleted {get;set;}
    public String Category { get; set; }
    public String Name { get; set; }
    public Int32 MaxPointsEach { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2011-01-17
    • 2019-06-08
    • 2016-08-19
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多