我被告知在我正在做的事情中使用Repeater控件,这是一个带有ASP.NET控件的“数据输入”屏幕 - 一个标准的“地址”形式。在这种情况下,表单上的字段将重复两次,一次用于原始值,一次用于更改的值。我之前没有使用过这个控件,但似乎我必须绑定到数据库。相反,我有一个通过存储库获得的Entity对象。我可以绑定到这样的对象吗?
[DataContract()]
public class RON
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string Comments { get; set; }
然后,我有我的ASP.NET字段,我在CSS中使用以下字段来排列字段。我可以将它放在ItemTemplate中吗?
<div class="row1">
<div class="label">
ID:
</div>
<div class="value">
<asp:Label ID="lblId" runat="server" />
</div>
答案 0 :(得分:6)
您可能希望在 PageLoad 中执行某些操作,例如:
List<SomeBusinessObj> MyEntityCollection = Repository.Load();
然后,您可以使用转发器控件的 DataSource 属性将实体对象集合绑定到转发器控件。
rptrMyRepeater.DataSource = MyEntityCollection;
然后通过在该控件上调用 DataBind ,您的集合将绑定到该控件。
rptrMyRepeater.DataBind();
然后,您需要做的就是使用Repeater的数据绑定事件将自定义属性应用于转发器的控件。
protected void rptrExample_OnItemDataBound(object Sender, RepeaterItemEventArgs Args)
{
if (Args.Item.ItemType == ListItemType.Item || Args.Item.ItemType == ListItemType.AlternatingItem)
{
SomeBusinessObj Obj = (SomeBusinessObj)Args.Item.DataItem;
Label LabelControl = (Label)Args.Item.FindControl("lblSomeLabel");
LabelControl.Text = Obj.CustomProperty;
}
}
将为每个行项调用 ItemDataBound 事件,因此每次调用它时,您将处理该行项的控件和数据绑定对象。
另一种方法是在标记中直接数据绑定,而不是使用 OnItemDataBound 事件。
<asp:Label Text='<%# ((MyObjects.SomeBusinessObj)Container.DataItem).CustomProperty %>' runat="server" />
直接投射避免了对 DataBinder.Eval 的调用,以及反射的开销。
答案 1 :(得分:4)
你可以 你应该使用ItemTemplate来显示每个对象的标记,你也可以使用HeaderTemplate和FooterTemplate来显示它们。
例如:
<asp:Repeater id="myRepeater" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "MyProperty1") %>,
<%# DataBinder.Eval(Container.DataItem, "MyProperty2") %>,
<br />
</ItemTemplate>
</asp:Repeater>
定义模板后,只需将转发器的数据源设置为您的集合并对其进行数据绑定
myRepeater.DataSource = myCollection;
myRepeater.DataBind();
答案 2 :(得分:2)
您可以将转发器绑定到任何列表。因此,您可以添加要绑定到列表的原始对象和已更改对象,并将对象绑定到转发器。
var hotelsList = new List<Ron>();
hotelsList.Add(originalRon);
hotelsList.Add(changedRon);
rptrHotels.DataSource = hotelsList;
rptrHotels.DataBind();
Ron类中的属性将绑定如下:
<asp:Repeater ID="rptrHotels" runat="server">
<ItemTemplate>
<div>
<div class="label">
RONId:
</div>
<div class="value">
<%#Eval("RONId")%>
</div>
</div>
....
</ItemTemplate>
</asp:Repeater>
答案 3 :(得分:0)
绝对可行,无需在编译代码中执行 - 您可以直接绑定到项目模板中的内容:
<div class="label">
Hotel:
</div>
<div class="value">
<%# DataBinder.Eval(Container.DataItem, "Hotel") %>
</div>
<asp:LinkButton ID="lnkMap" runat="server" Command='<%# ((MyClass)Container.DataItem).MyProperty %>'>Map</asp:LinkButton></div>
</div>