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

私は問題を解決しました。トリックは、ユーザーが削除ボタンをクリックしたときにコントロールを削除するのではなく、非表示にすることでした。

于 2011-05-05T11:45:50.903 に答える
1

ASP.NET でコントロールを動的に追加したり削除したりしたい場合は、Dave Reed の優れた決定的な記事「Truly Understanding Dynamic Controls 」読む必要があります。

関連する問題 (ページへのすべての要求ごとにツリーのコントロールを完全に再構築する必要があるなど) を理解していない場合は、苦痛の世界にサインアップしていることになります。これらの問題を理解できれば、ASP.NET 開発者としては全般的に優れたものになるでしょう (少なくとも私はそうでした)。幸運を!キース

于 2011-04-28T18:13:50.307 に答える
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 に答える