2010-11-22 77 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>