2009-05-14 9 views
15

Ben kişiAyrıca, ilişkili öğeleri güncellemek için tekrarlayıcıyı <Person> Listesine nasıl bağlarım? (2 yönlü)

class Person 
{ 
    string Forename 
    { 
     get;set; 
    } 
    string Surname 
    { 
     get; set; 
    } 
} 

Ve şöyle bir asp tekrarlayıcı kontrolüne bağlamak sınıfı tarafından tanımlanan bir List < Kişi> varsa:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="lblForename" runat="server" Text="Forname" AssociatedControlID="txtForename" /> 
     <asp:TextBox ID="txtForename" runat="server" Text='<%# ((Person)Container.DataItem).Forename %>' /> 
     <br /> 
     <asp:Label ID="lblSurname" runat="server" Text="Forname" AssociatedControlID="txtSurname" /> 
     <asp:TextBox ID="txtSurname" runat="server" Text='<%# ((Person)Container.DataItem).Surname %>' /> 
     <br /> 
    </ItemTemplate> 
</asp:Repeater> 

Kullanıcının nesneye geri yazdığı verileri almanın en iyi yolu nedir?

Tüm veri bağlama noktasının bunun sizin için etkili bir şekilde ele alınması olduğunu düşündüm, ancak Repeater1.Items koleksiyonunu incelediğimde hiçbir değişiklik yapılmıyor. O durumda

//This is only intended to be pseudo code 
for each item in Repeater1.Items 
    ((Person)item.DataItem).Forename = item.FindControl("txtForname").Text; 
end for 

çizgisinde bir şeyler yapmak kod yazmak zorunda mıyım, neden hep Dataıtem özelliği boş?

Ek bilgi:

Ben zaten Bind("Forename") kullanarak denedim

this.Repeater1.DataSource = this.PersonList; 
this.Repeater1.DataBind(); 

etkisi kodunu arıyorum, ama bu geri TextBox bilgi getirmek görünmüyor nesneye, bunu elle yapmak zorunda mıyım?

cevap

8

basit bir yanıt var gibi Tekrarlayıcı kontrolünün, aradığınız iki yönlü veri bağlama türünü desteklememesidir. Bunun üzerine, DataItem özelliği yalnızca tekrarlayıcı öğesinin oluşturulması sırasında kullanılır ve ItemDataBound olayından sonra hiçbir şey ayarlanmaz. Bu nedenle, geri göndermeden sonra belirli bir tekrarlayıcı öğesi oluştururken kullandığınız orijinal nesneyi almak için bu özelliği kullanamazsınız (sözde kodunuzda yaptığınız gibi).

Önerdiğiniz gibi yineleyici öğelerin arasında geçiş yapmanız gerekir (öğeyi bir şey yapmadan önce ListItemType.Item veya AlternatingItem öğesinden kontrol ettiğinizden emin olun) ve ardından metin kutularından değerleri ayıklayın ve bunları bir güncelleştirmede kullanın. .

+0

Beklediğim cevap değil ama haklısınız gibi görünüyor. – ilivewithian

2

Yukarıdakilere ek olarak, tekrarlayıcıyı Listeye de bağlamanız gerekir. Şu anda metin kutuları Forename değerine atanır (veya potentailly sen

<# Bind("Forename") %> 

etiketi kullanırsanız bağlı), ancak Tekrarlayıcı Konteyner hiçbir DataItem vardır. Eğer kişi listesi ile Tekrarlayıcı Bind Eğer

7

istediğiniz

this.Repeater1.DataSource = GetPersons(); 

iken GetPersons() 'dir kişinin listesini döndüren bir yöntem nesneleri Eğer

<asp:TextBox ID="txtForename" runat="server" Text='<%# Eval("Forename") %>' /> 
+4

Hayır, bu tekrarlayıcıyı doldurur, ancak kullanıcı tarafından girilen verileri geri almaz. Eval 1 yönlü veri bağlama, soru 2 yönlü veri bağlama hakkında soruyor. –