2010-01-07 62 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