【问题标题】:ListView fields not getting postedListView 字段未发布
【发布时间】:2010-01-07 18:42:26
【问题描述】:

我知道我以前做过类似的事情,但我不知道为什么它现在不起作用。我有一个带有一些文本框的 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 时,我看到的只是“结尾”。我在这里做错了什么?

【问题讨论】:

  • 不应该是foreach中的lv_bar吗?
  • 是的,对不起,我试图在粘贴之前概括实际代码——但这不是问题:)

标签: asp.net listview webforms


【解决方案1】:

您使用非持久对象作为数据源的问题。

由于单击该按钮,您会生成一个回发并且 lv_chapters 不包含任何项目。在 foreach 所在的行设置断点,你会看到 lv_chapters.Items 为 null,或者它的 Count 属性返回 0。

【讨论】:

  • 好的,我确实注意到了这种行为。那么我应该使用什么作为 DataSource 呢?
  • 我想到的一种可能性是 ObjectDataSource。 Asp.net 将自动关心数据源的“持久性”。另一种解决方案是在每次回发时绑定 ListView。但请记住,到目前为止,这限制了您,您不能在该列表视图中拥有任何生成回发(如图像按钮)的控件,因为您在每个 Page_Load 上绑定列表,并且图像按钮的 Event_Handler 永远不会执行,因为如果在调用事件处理程序之前重新绑定数据源,则会破坏触发的事件。
  • ObjectDataSource 有意义,但我不断收到“找不到 ObjectDataSource 的 TypeName 属性中指定的类型”
  • 看看MSDN msdn.microsoft.com/en-us/library/…这篇文章描述得比我总结的都好。
  • 是的,我想是因为我没有把它放在 App_Code 中。我会将您标记为已接受,您非常有帮助,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多