2010-01-07 69 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中嗎? – 2010-01-07 18:45:47

+0

是的,對不起,我試圖在粘貼之前概括實際的代碼 - 但這不是問題:) – 2010-01-07 18:47:26

回答

1

問題是您正在使用非持久對象作爲DataSource。

由於點擊該按鈕,您將生成一個回傳,並且lv_chapters不包含任何項目。在foreach所在行設置一個斷點,您將看到lv_chapters.Items爲null,或者它的Count屬性返回0.

+0

好吧,我注意到了這種行爲。那麼我應該如何使用DataSource? – 2010-01-07 18:53:16

+0

彈出我腦海中的一種可能性是ObjectDataSource。 Asp.net會自動關心數據源的「持久性」。 另一種解決方案是在每次回發時綁定ListView。但請記住,這限制了你到目前爲止,你不能有任何控制在該列表視圖中生成一個回發(像一個圖像按鈕),因爲你綁定列表每個Page_Load和Event_Handler imagebutton永遠不會因爲如果在事件處理程序被調用之前重新綁定數據源,則會銷燬觸發的事件。 – citronas 2010-01-07 19:14:00

+0

ObjectDataSource是有道理的,但我一直在收到「無法找到ObjectDataSource的TypeName屬性中指定的類型」 – 2010-01-07 19:20:01