如何在回发后获得动态控件的值?

时间:2009-11-16 18:51:53

标签: c# asp.net asp.net-2.0 postback dynamic-controls

我有一个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时进行数据绑定,那么我就无法在回发时找到动态控件。如果我每次加载页面时绑定,那么我的静态字段将设置为默认文本。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Very similar question(而不是填充ListView,这家伙正在生成一组按钮)。简而言之,您会发现必须将项目存储在Viestate的列表中 - 而不是将其存储在Postback上并重新填充列表。

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

希望它有所帮助。