动态添加和持久化TextBoxes到用户控件

时间:2011-06-15 01:38:53

标签: c# .net dynamic

使用C#.NET 4.0和Umbraco

我有一个用户控件,其上有一个按钮,允许用户动态地向表单添加其他文本框。我尝试过无数种方法,但无法在页面加载之间保留输入动态文本框的任何数据。

以下是用户界面:

<div id="new-item">
<h3>Add new menu item</h3>
<div><label for="ItemTitle">Title</label><asp:TextBox ID="ItemTitle" runat="server" CssClass="title"></asp:TextBox></div>
<div><label for="ItemDescription">Text</label><textarea id="ItemDescription" runat="server" rows="5" cols="20"></textarea></div>
<div><label for="ItemPrice">Price</label><asp:TextBox ID="ItemPrice" runat="server" CssClass="price"></asp:TextBox></div>
<div class="new-item-options">
    <p><strong>Menu item options (optional) </strong><asp:Button ID="AddMenuItemOption" runat="server" Text="Add Option" OnClick="AddOption" /></p>
    <asp:Panel ID="MenuItemOptionsPanel" runat="server"></asp:Panel>
    <asp:HiddenField ID="ItemOptionCount" runat="server" />
</div>
<div><asp:Button ID="AddItemButton" runat="server" Text="Save" /></div>
<asp:HiddenField ID="ItemID" runat="server" />
<asp:HiddenField ID="ItemOrder" runat="server" />

在AddOption按钮中单击事件:

protected void AddOption(object sender, EventArgs e)
{
    var dynamicControlCount = Convert.ToInt32(ItemOptionCount.Value) + 1;

    for (var option = 0; option < dynamicControlCount; option++)
    {
        MenuItemOptionsPanel.Controls.Add(new Literal { ID = "OptionTextLiteral" + option, Text = "<label>Option Text</label>" });
        MenuItemOptionsPanel.Controls.Add(new TextBox { ID = "OptionTextBox" + option });
        MenuItemOptionsPanel.Controls.Add(new Literal { ID = "OptionPriceLiteral" + option, Text = "<label>Option Price</label>" });
        MenuItemOptionsPanel.Controls.Add(new TextBox { ID = "OptionPriceBox" + option });
    }

    ItemOptionCount.Value = dynamicControlCount.ToString();
}

我知道我需要在Page_Load或OnInit方法中创建这些动态控件,但问题是当页面第一次加载时,我不想创建任何动态控件,只有用户每次单击该按钮我想添加额外的控件,并且已经存在的控件中存在任何数据。

有什么想法吗?我不认为我离得太远了。)

2 个答案:

答案 0 :(得分:0)

你可以在page_load中测试条件(可能是Postback),然后如果你需要生成控件,那么这样做吗?

答案 1 :(得分:0)

也许你必须看看这个(系列)article。它详细解释了如何使用动态创建的控件,尤其是关于如何持久化ViewState。

否则,我建议你采用AJAX方式(使用JavaScript创建控件,使用AJAX将数据发布回服务器以供服务器处理)。在这种情况下,您不必担心PostBack和ViewState,它也会让用户体验更好!