2010-01-07 2 views
0

Я знаю, что раньше делал что-то подобное, но я понятия не имею, почему он сейчас не работает. У меня есть ListView с некоторыми текстовыми полями. Я хочу прочитать текст из этих ящиков, когда я нажимаю кнопку (linkbutton, что угодно).Поле ListView не отправлено

 <asp:ListView runat="server" ID="lv_bar" EnableViewState="true"> 
      <LayoutTemplate> 
       <table> 
        <tr> 
         <th>Foo</th> 
        </tr> 
        <tr runat="server" id="itemPlaceholder"></tr> 
       </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <tr> 
        <td><asp:LinkButton ID="lb_delete" CausesValidation="false" runat="server" Text="Del" /></td> 
        <td><asp:TextBox id="txt_foo" runat="server" /></td> 
       </tr> 
      </ItemTemplate> 
     </asp:ListView> 
     <asp:LinkButton ID="lb_add" CausesValidation="false" runat="server" Text="Add" /> 

И тогда здесь соответствующий код-за материал:

protected void Page_Load(object sender, EventArgs e) 
{ 
    lb_chapter_add.Click += lb_chapter_add_Click; 

    if (!IsPostBack) 
    { 
      lv_chapters.DataSource = new List<Foo>() { new Foo() { Name = "harbl"} }; 
      lv_chapters.DataBind(); 
     } 
    } 

void lb_add_Click(object sender, EventArgs e) 
{ 
    foreach (ListViewDataItem item in lv_bar.Items) 
    { 
     var txt_foo = (TextBox)item.FindControl("txt_foo"); 
     Response.Write("foo: " + txt_foo.Text); 
    } 
    Response.Write("<br />the end"); 
    Response.End(); 
} 

Но что я вижу, когда я ввожу текст в txt_foo и нажмите lb_add просто «конец». Что я здесь делаю неправильно?

+0

не должно быть lv_bar в foreach? –

+0

Да, извините, я пытался обобщить фактический код перед его вставкой - но это не проблема :) –

ответ

1

Проблема в том, что вы используете не постоянный объект как DataSource.

Из-за нажатия кнопки вы создаете обратную передачу, а lv_chapters не содержит никаких элементов. Установите точку останова в строке, где находится foreach, и вы увидите, что lv_chapters.Items в нуле или что свойство Count возвращает 0.

+0

Хорошо, я заметил это поведение. Итак, что я должен использовать в качестве DataSource? –

+0

Одна возможность, которая появляется у меня в голове, это ObjectDataSource. Asp.net автоматически будет заботиться о «стойкости» источника данных. Другим решением было бы связать ListView при каждой обратной передаче. Но имейте в виду, что это ограничивает вас до сих пор, что вы не можете иметь никаких элементов управления внутри этого списка, которые генерируют обратную передачу (например, кнопку изображения) из-за того, что вы связываете список на каждой странице PageLoad, а Event_Handler для кнопки с изображением никогда не будет выполняется, потому что вы уничтожаете уволенное событие, если вы перекомпилируете источник данных до вызова обработчика события. – citronas

+0

ObjectDataSource имеет смысл, но я продолжаю получать «Тип, указанный в свойстве TypeName объекта ObjectDataSource, не найден» –