Получение значения TextBox из повторителя - PullRequest
4 голосов
/ 24 июля 2011

На Page_Load, я связываю повторитель, используя EF4. Повторитель содержит несколько текстовых полей, которые заполняются в начале, но пользователь может редактировать. Как я могу прочитать эти текстовые поля на более позднем постбеке?

page.aspx (выдержка):

<asp:Repeater ID="repOrders" runat="server">
  <ItemTemplate>
    <p>
      <%# Eval("Id") %> -
      <asp:TextBox ID="txtName" Text='<%# Eval("Name") %>' runat="server">
      </asp:TextBox>
    </p>
  </ItemTemplate>
</asp:Repeater>

page.aspx.cs (извлечение):

protected void Page_Load(object sender, EventArgs e) {
  using (var ctx = new Ctx()) {
    var ds = ctx.Orders;
    repOrders.DataSource = ds;
    repOrders.DataBind();
  }
}

protected void lnkCheck_Click(object sender, EventArgs e) {
  Response.Write(((TextBox)repOrders.Items[0].FindControl("txtName")).Text);
}

Проблема в том, что когда я нажимаю lnkCheck, повторитель сначала заново заполняется из базы данных, поэтому любые изменения, вносимые пользователем в текстовые поля, теряются.

И если я добавлю if (IsPostBack) return; в Page_Load, то повторитель будет пуст.

Как мне обойти это?

1 Ответ

1 голос
/ 24 июля 2011

Заполняйте ретранслятор только в случае обратной передачи.Пока для ретранслятора включено viewstate, ваши данные будут сохраняться.

 protected void Page_Load(object sender, EventArgs e) {

    if(!IsPostBack)
    {
     using (var ctx = new Ctx()) {
        var ds = ctx.Orders;
        repOrders.DataSource = ds;
        repOrders.DataBind();
      }
    }

    }

Как вы поднимаете «поздний постбэк» для чтения текстовых значений из повторителя?Обычно предпочтительнее было бы поднять команду item из репитера, а затем использовать элемент управления find для получения значения текстового поля в шаблоне элемента.

...