簡體   English   中英

C#-如何在單擊按鈕時動態添加和刪除多個控件

[英]C# - How to add and delete multiple controls dynamically on button click

我正在嘗試編寫一個調查應用程序,該應用程序要求動態添加和刪除文本框。 我設法在單擊按鈕時動態創建了文本框,但是我試圖找出如何動態刪除文本框。 當前,只有當我從上一個開始刪除文本框時,刪除功能才能正常工作。 當我嘗試刪除中間的任何文本框,然后刪除最后一個文本框時,將創建一個空白文本框。 我是編程新手,不能確定這是否是最佳方法。 另外,我想找出是否有可能將文本框嵌套(允許用戶向其選擇題添加選項)到創建的文本框並稍后再檢索值。

后面的代碼:

public partial class Dynamic_Form : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < TotalNumberAdded; ++i)
        {
            AddQuestion(i + 1);
        }
    }
    protected int TotalNumberAdded
    {
        get { return (int)(ViewState["TotalNumberAdded"] ?? 0); }
        set { ViewState["TotalNumberAdded"] = value; }
    }


    protected void btn_add_Click(object sender, EventArgs e)
    {
        TotalNumberAdded++;
        AddQuestion(TotalNumberAdded);
    }

    private void AddQuestion(int controlNumber)
    {
        Panel newquestion = new Panel();
        newquestion.ID = "Panel_" + controlNumber;

        TextBox questionbox = new TextBox();
        questionbox.ID = "Question_" + controlNumber;
        questionbox.Text = "Question";

        Button BtnDelete = new Button();
        BtnDelete.ID = "BtnDelete_" + controlNumber;
        BtnDelete.Text = "Delete"+ controlNumber;
        BtnDelete.Click += delete_Click;

        DropDownList DDLType = new DropDownList();
        DDLType.ID = "DDLType_" + controlNumber;
        DDLType.Items.Insert(0, new ListItem("TextField", ""));
        DDLType.Items.Insert(1, new ListItem("Multiple Choice", ""));

        //add controls
        questions.Controls.Add(newquestion);
        newquestion.Controls.Add(questionbox);
        newquestion.Controls.Add(DDLType);
        newquestion.Controls.Add(BtnDelete);
    }

    private void delete_Click(object sender,EventArgs e)
    {
        Button btn = (Button)sender;
        Control control = btn.Parent;

        if (questions.Controls.Contains(control))
        {
            questions.Controls.Remove(control);
            control.Dispose();
            TotalNumberAdded--;
            Response.Write("Number of Questions:" + TotalNumberAdded);
        }
    }
}

HTML文件:

<body>
<form id="form1" runat="server">
    <div>
        <h1>Test Form</h1>
        <asp:Button ID="btn_add" runat="server" Text="Add" OnClick="btn_add_Click" />
    </div>
    <div id="questions" runat="server">
    </div>
</form></body>

@Aaron Yong,您也可以使用jQuery或javascript從客戶端執行這些方案。 我已經給出了以下代碼,以實現服務器端的目標。

private void delete_Click(object sender,EventArgs e)
    {
        Button btn = (Button)sender;
        Control control = btn.Parent;

        if (questions.Controls.Contains(control))
        {
            TotalNumberAdded--;
            questions.Controls.Clear();
            for (int i = 0; i < TotalNumberAdded; ++i)
            {
                AddQuestion(i + 1);
            }
            Response.Write("Number of Questions:" + TotalNumberAdded);
        }
    }

您想要再次重新創建控件,我添加了for循環並在delete click事件中刪除了一些代碼,那么您將實現。

正如我上面給出的答案,您還可以從以前的答案中刪除下面的代碼。

questions.Controls.Remove(control);
control.Dispose();

您將得到確切的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM