0

文字列のリストが2つあり、テキストボックスのグリッドを動的に作成したいと思います。

List<string> X = {"A", "B", "C"};
List<string> Y = {"1", "2", "3", "4"};

          A     B     C
     1   TBX   TBX   TBX
     2   TBX   TBX   TBX
     3   TBX   TBX   TBX
     4   TBX   TBX   TBX

     [Button]

テキストボックスにデータを入力してボタンをクリックすると、これらのテキストボックスを繰り返し処理して、各テキストボックスに関連付けられている「X」座標と「Y」座標を決定できるようにしたいと思います。

このテキストボックスのグリッドを動的に作成する方法はおそらく理解できますが、データを投稿するときに問題が発生すると思います。ポストバック後に動的に作成されたテキストボックスから値を取得するにはどうすればよいですか?

反復と実際のロジックを実行することに問題はありませんが、データをコンテナーに入れて反復できるようにする方法がわかりません。投稿されたデータを読みながら、テキストボックスを再度動的に作成する必要がありますか?それはどのように見えますか?

4

2 に答える 2

5

これが別のアプローチです。asp.netページにプレースホルダーを設定できます。コードビハインドでは、動的テキストボックスを使用してテーブルを動的に作成し、プレースホルダー内に挿入します。この場合、各テキストボックスのIDを制御できます。ポストバックでは、テキストボックスに入力された値が保持されます(IDは明確であるため、JavaScript操作も実行できます)

これがaspxです

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="Test2.DynamicControls" %>

<!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">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="PHDynamicTable" runat="server"></asp:PlaceHolder>
        <asp:Button runat="server" ID="btnSubmit" Text="Submit" 
            onclick="btnSubmit_Click" />
    </div>
    </form>
</body>
</html>

背後にあるコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Test2
{
    public partial class DynamicControls : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected override void OnPreInit(EventArgs e)
        {
            base.OnPreInit(e);
            CreateTextBoxesInTable();
        }

        private void CreateTextBoxesInTable()
        {
            PHDynamicTable.Controls.Clear();

            List<string> X = new List<string>() { "A", "B", "C" };
            List<string> Y = new List<string>() { "1", "2", "3", "4" };

            Table table = new Table();
            table.ID = "dynamicTable";

            TableRow tr;
            foreach (string y in Y)
            {
                tr = new TableRow();

                foreach (string x in X)
                { 
                    TableCell tc = new TableCell();

                    TextBox textBox = new TextBox();
                    textBox.ID = "txt_" + x + y;
                    tc.Controls.Add(textBox);

                    tr.Cells.Add(tc);
                }

                table.Rows.Add(tr);
            }

            PHDynamicTable.Controls.Add(table);
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            if (PHDynamicTable.Controls.Count > 0)
            {
                Table dynamicTable = (Table)PHDynamicTable.FindControl("dynamicTable");
                if (dynamicTable != null)
                {
                    foreach (TableRow tr in dynamicTable.Rows)
                    {
                        foreach (TableCell tc in tr.Cells)
                        {
                            TextBox textBox = (TextBox)tc.Controls[0];
                            string text = textBox.Text;
                            //Do whatever you want with the control
                        }
                    }
                }
            }
        }
    }
}

スクリーンショットはほとんどありません

データを含む入力画面

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

ポストバック(送信)

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

送信後

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

于 2012-07-03T02:20:01.873 に答える
2

使いやすさの問題はさておき、ASP.NETMVCではなくASP.NETWebフォームを使用していると仮定します。Webフォームでは、これは一種の悪夢になります。あなたは確かに2つのコントロールをネストすることができます。1つのコントロールのデータソースが最初のリストになり、2番目のデータソースが2番目のリストになります。次に、セカンダリリピーターテンプレートにasp:textboxを配置します。ただし、ここでのIDは、明示的に設定されている場合でも、実際には生成された値になります。これは、リピーターがASP.nETWebformsで名前付けコンテナーとして知られているためです。これは、IDの値が実行時に変更されることを意味します。

ポストバックでは、親リピーターのコントロールツリーを反復処理して、子リピーターを見つけることができます。次に、子リピーターで、そのリピーターのコントロールを繰り返し処理して、テキストボックスを見つけることができます。何かのようなもの:

<asp:Repeater>
    <itemtemplate>
        <asp:repeater>
            <itemtemplate>
                <asp:textbox />
            </itemtemplate>
        </asp:repeater>   
    </itemtemplate>
</asp:repeater>

次に、コードビハインドのポストバック[擬似コード]

foreach(Control c in myTopRepeater.Controls){
    if(c == RepeaterControl) //is of type repeater. again, pseudo code
    {
         foreach(Control subC in c)
         {
             if(subC == textBox)
             {
                 //Compare generated name, etc to my Lists

             }
         }
    }
}

コンテナの命名について読むと役立つ場合があります。予測可能な命名設定を取得できますが、100%直感的ではありません。 http://www.4guysfromrolla.com/articles/031710-1.aspx

幸運を!

于 2012-07-03T00:17:03.967 に答える