带对象的中继器控制?

时间:2010-11-22 14:58:12

标签: asp.net

我被告知在我正在做的事情中使用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>

4 个答案:

答案 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>