将 DataTable 绑定到 Repeater
Binding DataTable to Repeater
我已经尝试了我能在网上找到的所有文章组合,此时我正在努力。下面的代码似乎甚至没有尝试数据绑定。当 "throw exception" 行未被注释时,它不会抛出异常。
我尝试只传递 DataTable IEnumerable 而不是 datatable/datarows,但我得到 "DataBinding: 'System.Data.DataTable' does not contain a property with the name '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>
在尝试了很多不同的东西之后,我终于弄明白了。我最终不得不使它成为一个用户定义的 class 列表,它与 table 结构相匹配。看起来任何一种绑定方式都可以在下面使用。
如果它对某人有帮助,这里是:
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; }
}
我已经尝试了我能在网上找到的所有文章组合,此时我正在努力。下面的代码似乎甚至没有尝试数据绑定。当 "throw exception" 行未被注释时,它不会抛出异常。
我尝试只传递 DataTable IEnumerable 而不是 datatable/datarows,但我得到 "DataBinding: 'System.Data.DataTable' does not contain a property with the name '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>
在尝试了很多不同的东西之后,我终于弄明白了。我最终不得不使它成为一个用户定义的 class 列表,它与 table 结构相匹配。看起来任何一种绑定方式都可以在下面使用。
如果它对某人有帮助,这里是:
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; }
}