Asp.net

如何將轉發器綁定到 List<Person> 以同時更新綁定的項目?(2種方法)

  • March 14, 2016

如果我有一個 List < Person >,其中 person 由類定義

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

我將它綁定到一個如下所示的 asp 轉發器控制項:

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

將使用者鍵入的數據返回到對像中的最佳方法是什麼?

我認為數據綁定的全部意義在於它已經為您有效地處理了,但是當我檢查 Repeater1.Items 集合時,沒有進行任何更改。我是否必須編寫程式碼來做一些事情

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

如果是這樣,為什麼 DataItem 屬性總是空的?

附加資訊:

我已經在呼叫程式碼的效果

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

我嘗試過使用Bind("Forename"),但這似乎不會將 TextBox 中的資訊帶回對像中,我是否必須手動執行此操作?

簡單的答案是Repeater 控制項不支持您正在尋找的那種雙向數據綁定。最重要的是,DataItem 屬性僅在創建中繼器項目期間使用,並且在 ItemDataBound 事件之後,它被設置為空。因此,您不能使用該屬性來獲取回發後創建特定轉發器項目時使用的原始對象(就像您在虛擬碼中所做的那樣)。

您將必須按照您的建議遍歷中繼器項目(確保在執行任何操作之前檢查該項目是 ListItemType.Item 還是 AlternatingItem),然後從文本框中提取值並在更新中使用它們。

引用自:https://stackoverflow.com/questions/864149