2

以下代码块允许用户动态创建文本框控件。但是,在每次创建时,我都想添加一个删除按钮来删除指定的文本框。我知道我可以通过在创建文本框时添加按钮控件并将事件分配给相关按钮来做到这一点。但是,这样的行为会导致不方便的情况,例如当您删除文本框时,有时它会删除最后一个文本框,有时它会成功执行。我的问题是如何在创建的每个文本框附近添加一个按钮,让用户删除创建的控件,同时保留所有其他动态控件?

首页:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="MyAspnetApp.DynamicControls" EnableViewState="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"></head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnAddTextBox" runat="server" Text="Add" OnClick="btnAddTextBox_Click" />
        <asp:Button ID="btnWriteValues" runat="server" Text="Write" OnClick="btnWriteValues_Click" />
        <asp:PlaceHolder ID="phControls" runat="server" />
    </div>
    </form>
</body>
</html>

后面的代码:

using System;
using System.Web.UI.WebControls;

namespace MyAspnetApp
{
    public partial class DynamicControls : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recreate textbox controls
            if(Page.IsPostBack)
            {
                for (var i = 0; i < TextBoxCount; i++)
                    AddTextBox(i);
            }
        }

        private int TextBoxCount
        {
            get 
            {
                var count = ViewState["txtBoxCount"];
                return (count == null) ? 0 : (int) count;
            }
            set { ViewState["txtBoxCount"] = value; }
        }

        private void AddTextBox(int index)
        {
            var txt = new TextBox {ID = string.Concat("txtDynamic", index)};
            txt.Style.Add("display", "block");
            phControls.Controls.Add(txt);
        }

        protected void btnAddTextBox_Click(object sender, EventArgs e)
        {
            AddTextBox(TextBoxCount);
            TextBoxCount++;
        }

        protected void btnWriteValues_Click(object sender, EventArgs e)
        {
            foreach(var control in phControls.Controls)
            {
                var textBox = control as TextBox;
                if (textBox == null) continue;
                Response.Write(string.Concat(textBox.Text, "<br />"));
            }
        }
    }
}
4

4 回答 4

1

如果您想在 ASP.NET 中动态添加和删除控件,您必须阅读 Dave Reed 的优秀而权威的文章:“真正了解动态控件”。

如果您不了解所涉及的问题——例如,必须在对页面的每个请求时完全重建树的控件的要求——那么你正在报名参加一个痛苦的世界。一旦你真正理解了这些问题,你就会成为一个更好的 ASP.NET 开发人员(至少我是)。祝你好运!基思

于 2011-04-28T18:13:50.307 回答
1

我已经解决了这个问题。诀窍是使其不可见,而不是在用户单击删除按钮时删除控件。

于 2011-05-05T11:45:50.903 回答
0

我建议您不要通过 Full PostBack 这样做。你最好用 Javascript 把它隐藏在客户端。

如果您需要保存一些“状态”服务器端,请使用 AJAX Postbacks AKA XHR 与服务器通信。(我只是讨厌翻页,哈哈)

顺便说一句,这是这类东西的完美 fwk: http ://examples.ext.net/#/Events/DirectMethods/Overview/

于 2011-04-28T00:03:27.207 回答
0

<asp:repeater>可能是您正在搜索的内容。然后删除按钮的单击处理程序将仅删除父项(这将删除整个重复元素),添加处理程序将添加另一个元素。

于 2011-04-28T00:03:33.683 回答