2010-11-22 79 views
0

我被告知在我正在做的事情中使用Repeater控件,这是一个带有ASP.NET控件的“数据输入”屏幕 - 一个像表单一样的标准“地址”。在情况下,表单上的字段会重复两次,一次是原始值,一次是更改后的值。我以前没有使用过这个控件,但是好像我必须绑定到数据库。相反,我有一个通过Repository获得的实体对象。我可以绑定到像这样的对象吗?中继器控制对象?

[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> 

回答

6

你可能会希望做一些你pageLoad的如:

List<SomeBusinessObj> MyEntityCollection = Repository.Load(); 

然后,您可以将您的实体对象集合绑定使用中继器的数据源财产Repeater控件控制。

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和反射的开销。

+0

谢谢!我是否使用Repeater中的ItemTemplate来包围我的标记? – 2010-11-22 15:16:39

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> 
2

您可以 你应该使用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

您可以转发绑定到任何名单。因此,您可以添加要绑定到列表的原始对象和已更改对象,并将数据绑定到中继器。

var hotelsList = new List<Ron>(); 
hotelsList.Add(originalRon); 
hotelsList.Add(changedRon); 
rptrHotels.DataSource = hotelsList; 
rptrHotels.DataBind(); 

在罗恩类的属性将被绑定这样的:

<asp:Repeater ID="rptrHotels" runat="server"> 
    <ItemTemplate> 
     <div> 
      <div class="label"> 
       RONId: 
      </div> 
      <div class="value"> 
       <%#Eval("RONId")%> 
      </div> 
     </div> 
     .... 
    </ItemTemplate> 
</asp:Repeater>