我有一个listview,可以在ItemDataBound事件中添加控件。当回发发生时,我找不到新的控件。经过一些研究,我发现ASP .NET每次都需要创建这些控件,即使在回发后也是如此。从那里我移动了函数来绑定if (!Page.IsPostBack)
条件之外的ListView。现在我得到动态控件值,但我的静态控件设置为默认值。以下是我想要完成的一个示例:
为简洁起见,我在这个例子中留下了一些明显的东西。
<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
时进行数据绑定,那么我就无法在回发时找到动态控件。如果我每次加载页面时绑定,那么我的静态字段将设置为默认文本。
答案 0 :(得分:2)
尝试将ListView的数据绑定移动到OnInit()事件中。
答案 1 :(得分:0)
Very similar question(而不是填充ListView,这家伙正在生成一组按钮)。简而言之,您会发现必须将项目存储在Viestate的列表中 - 而不是将其存储在Postback上并重新填充列表。
请注意,此解决方案意味着删除数据绑定(出于其他原因,您可能不想这样做)。
希望它有所帮助。