0

我有一个在 ItemDataBound 事件中添加控件的列表视图。当回发发生时,我找不到新控件。经过一番研究,我发现 ASP .NET 每次都需要创建这些控件,即使在回发之后也是如此。从那里我移动了将 ListView 绑定到if (!Page.IsPostBack)条件之外的函数。现在我得到了动态控件的值,但我拥有的静态控件设置为默认值。这是我想要完成的一个示例:

为简洁起见,我在这个例子中留下了一些明显的东西。

<asp:ListView runat="server" ID="MyList" OnItemDataBound="MyList_ItemDataBound">
    <LayoutTemplate>
        <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
    </LayoutTemplate>

    <ItemTemplate>
        <asp:PlaceHolder runat="server" ID="ProductPlaceHolder">
            <asp:TextBox runat="server" ID="StaticField" Text="DefaultText" />
            <asp:PlaceHolder ID="DynamicItems" runat="server" />
        </asp:PlaceHolder>           
    </ItemTemplate>
</asp:ListView>

这是代码隐藏:

protected void MyList_ItemDataBound(object sender, System.Web.UI.WebControls.ListViewItemEventArgs e) {
    PlaceHolder DynamicItems = (PlaceHolder)e.Item.FindControl("DynamicItems");
    DynamicItems.Controls.Add(textbox);
}

所以,就像我说的那样,如果我只在那时进行数据绑定,Page != PostBack那么我在回发时找不到我的动态控件。如果我每次加载页面时都绑定,那么我的静态字段将设置为其默认文本。

4

2 回答 2

2

尝试将 ListView 的数据绑定移动到 OnInit() 事件中。

于 2009-11-16T19:38:24.337 回答
0

非常相似的问题(不是填充 ListView 而是生成一组按钮)。简而言之,您会发现您必须将项目存储在 Viestate 的列表中 - 而不是在 Postback 中将其取出并重新填充列表。

请注意,此解决方案意味着删除数据绑定(由于其他原因,您可能不想这样做)。

希望能帮助到你。

于 2009-11-16T19:11:02.973 回答