1

私は動的TextBoxを使用していて、ファイルのコードビハインドでそれらの値を取得しています。私はJavascriptを使用してこれらのボックスを作成しています。私のasp.netページコードは

    <script type="text/javascript">

        $(document).ready(function () {

            var counter = 1;

            $("#addButton").click(function () {

                if (counter > 10) {
                    alert("Only 10 textboxes allow");
                    return false;
                }

                var newTextBoxDiv = $(document.createElement('div'))
                     .attr("id", 'TextBoxDiv' + counter);


                newTextBoxDiv.html('<input type="text" name="textbox' + counter +
                      '" id="textbox' + counter + '" value="" >');

                newTextBoxDiv.appendTo("#TextBoxesGroup");
                counter++;
                return false;
            });
        });
    </script>

</head>

<body>

    <form id="form2" runat="server">

        <h1>jQuery add / remove textbox example</h1>

        <asp:TextBox runat="server" ID="txt1" type='text' name="textname" />
        <asp:Panel runat="server" ID='TextBoxesGroup'>
        </asp:Panel>
        <asp:LinkButton ID="addButton" runat="server">Add TextBox</asp:LinkButton>

        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </form>
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</body>

ページに1つのテキストボックスが表示されています。動的テキストボックスが作成されていない場合は、1つの値のみが表示されます。私のC#コードは

 protected void Button1_Click(object sender, EventArgs e)
    {
        string name = txt1.Text + ",";
        if (TextBoxesGroup.Controls.Count  > 0)
        {           
            for (int i = 1; i <= TextBoxesGroup.Controls.Count; i++)
            {
                name += Request.Form["textbox" + i] + ",";
            }    
        }

        Label1.Text = name;
    }

asp:buttonをクリックすると、(、)で区切られたすべての値が表示されます。ただし、上位2つの値のみが表示されます。1つはasp:Textboxで、2つ目は動的Textboxです。動的に作成されたすべてのテキストボックスの値が必要です。動的テキストボックスが追加されていない場合は、aspからの値のみが表示されます。 textBox...よろしくお願いします

4

2 に答える 2

3

クライアントでjavascriptを介して作成されたHTMLinput要素は、サーバーには含まれませんTextBoxesGroup.Controls

クライアントのDOM構造を変更しても、PageControlツリーには影響しません。影響を受けるのは、HttpRequestポストバック中のコンテンツのみです。input動的に作成された要素の数がデータに寄与したことを知る1つの方法Request.Formは、この情報をリクエストの一部として渡すことです。これが、隠しフィールドの提案に従わなければならない理由です。非表示フィールドの値は、クライアント側の入力の数を戻します。for新しい入力を作成し、サーバー側のコードで読み取り、整数に変換してループで使用するたびに、JavaScriptで設定する必要があります。

追加

<asp:HiddenField runat="server" ID="txtDynamicCount" value="0" />

formタグ内のマークアップに。行追加後のjavascriptclickイベントでcounter++;

$("#txtDynamicCount").val(counter);

Button1_Click

int count;
if (!int.TryParse(txtDynamicCount.Value, out count))
    count = 0;

for (int i = 1; i <= count; i++)
{
...
}

他の回答との重要な違いは、テキストボックス(入力要素)がフォームの送信間で保持されないことです。

于 2013-03-13T17:39:53.540 に答える
1

クライアント側でサーバーコントロールにデータを入力することはできません。代わりに、サーバーからそれらを設定する必要があります。これがサンプルです-

ここに画像の説明を入力してください

<asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
<asp:LinkButton ID="addButton" runat="server" OnClick="btnAdd_Click">Add TextBox</asp:LinkButton>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br/>
Posted Results: <asp:Label ID="Label1" runat="server" Text=""></asp:Label>

private List<int> _controlIds;

private List<int> ControlIds
{
    get
    {
        if (_controlIds == null)
        {
            if (ViewState["ControlIds"] != null)
                _controlIds = (List<int>)ViewState["ControlIds"];
            else
                _controlIds = new List<int>();
        }
        return _controlIds;
    }
    set { ViewState["ControlIds"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (int id in ControlIds)
        {
            var textbox = new TextBox();
            textbox.ID = id.ToString();

            PlaceHolder1.Controls.Add(textbox);
        }
    }
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    var reqs = ControlIds;
    int id = ControlIds.Count + 1;

    reqs.Add(id);
    ControlIds = reqs;

    var textbox = new TextBox();
    textbox.ID = id.ToString();

    PlaceHolder1.Controls.Add(textbox);
}

protected void Button1_Click(object sender, EventArgs e)
{
    var ids = ControlIds;
    foreach (var id in ids)
    {
        var textbox = (TextBox)PlaceHolder1.FindControl(id.ToString());
        Label1.Text += textbox.Text + ", ";
    }
}
于 2013-03-13T18:10:37.023 に答える