1

テーブルに未定義の行数をロードするページを作成しようとしています。各行には 2 つの列が含まれ、1 つの列は文字列、もう 1 つの列は TextBox です。送信ボタンをクリックすると、各 TextBox に入力された値を取得できるようにしたいと考えています。

私ができる前半は、明らかに実際のコードでは、これは foreach ループにあり、テキストボックス ID には一意の値が割り当てられ、後で再現して呼び出すことができます。

TableCell myCell = new TableCell();
myCell.Text = "StudentID";
TableCell nextCell = new TableCell();
TextBox mytext = new TextBox();
mytext.ID = "TxtBox1";
nextCell.Controls.Add(mytext);
TableRow myRow = new TableRow();
myRow.Cells.Add(myCell);
myRow.Cells.Add(nextCell);
TableStuUploads.Rows.Add(myRow);

送信ボタンをクリックすると、このコードを実行しようとします(一時コードATM、概念実証のもののみ):

TextBox tmptext = (TextBox)FindControl("TxtBox1");
Label1.Text = tmptext.Text;

しかし、それは tmptext を null に設定し、次の行で null ポインター例外を取得します。それで、私は試しました

TextBox tmptext = (TextBox)TableStuUploads.FindControl("TxtBox1");
Label1.Text = tmptext.Text;

同じエラー。それから私は試しました

foreach (Control x in TableStuUploads.Controls)
            {
                if (x.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox"))
                {
                    Label1.Text = ((TextBox)x).Text;

                }
            }

しかし、これをデバッグすると、TableStuUploads.Controls のカウントが 0 になっていることがわかります。

これらの動的に作成されたコントロールにどのように対処すればよいですか? 私は周りを検索しましたが、私が得た答えは、私がすでに試した3つの解決策につながりました。どこが間違っているのですか?

4

2 に答える 2

2

ポストバックで動的コントロールを再作成していない可能性があります。これは、各コントロールを検索し、各コントロールの値を取得するために必要です。

さらに、リピーターを使用してこれらのコントロールを作成することをお勧めします。これにより、保守とデバッグが容易になります。

于 2013-02-24T17:26:07.413 に答える
1

編集

@ShaiCohenが彼の答えで言っているように、ポストバック(page_load)ごとにテーブルを再作成する必要があります。

foreach (TableRow item in TableStuUploads.Rows)
{               
     TextBox tmptext = (TextBox)item.FindControl("TxtBox1");
     Label1.Text = tmptext.Text;
}
于 2013-02-24T17:36:00.667 に答える