0

ボタンがクリックされるたびにテキストボックスを作成するメソッドがあります。ただし、別の方法でIDにアクセスしようとしています。何かが範囲外のようです。コードは次のとおりです。Textbox

    public partial class _Default : System.Web.UI.Page
{
    TextBox box = new TextBox();

    protected void Page_Load(object sender, EventArgs e)
    {



    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ViewState["count"] = Convert.ToInt32(ViewState["count"]) + 1;
        Label1.Text = ViewState["count"].ToString();
        int test = int.Parse(string.Format("{0}", ViewState["count"]));

            for (int j = 0; j < test; j++)
            {

                TableRow r = new TableRow();

                box.ID = "Textbox" + j;

                TableCell c = new TableCell();
                c.Controls.Add(box);
                r.Cells.Add(c);
                table1.Rows.Add(r);
                Response.Write(box.ID);

            }

            if (test == 4)
            {
                Button1.Visible = false;
            }

    }

    protected void Button2_Click(object sender, EventArgs e)
    {

        Response.Write(box.ID);
    }

Button2_Clickを印刷して、box.IDアクセスできることを確認したいと思います。

4

4 に答える 4

3

あなたButton1_ClickButton2_Clickイベントは 2 つの別々のポストバックになります。 Boxこのシナリオでは、デフォルトのコンストラクターに設定されているものを超えて値が割り当てられることはありません。

編集: すべてのコード ビハインド オブジェクトと値の状態がポストバックで失われているためです。

于 2013-07-11T19:28:29.780 に答える
2

ユーザーがクリックした回数と同じ数のテキスト ボックスを常に作成するには、コードを実行する必要がありますButton1Page_Load

int test = 0;
if (ViewState["count"] != null)
   test = (int)ViewState["count"];

for (int j = 0; j < test; j++)
{
    TextBox box = new TextBox();
    box.ID = "Textbox" + j;
    textBoxes.Add(box.ID, box);
    TableRow r = new TableRow();
    TableCell c = new TableCell();
    c.Controls.Add(box);
    r.Cells.Add(c);
    table1.Rows.Add(r);
}

クラスメンバーtextBoxesはどこですか:Page

Dictionary<string, TextBox> textBoxes = new Dictionary<string, TextBox>();

次に、でButton2_Click

string ids = "";
foreach(string id in textBoxes.Keys)
{
    ids = ids + id + ",";
}
Response.Write(ids);
于 2013-07-11T20:00:51.160 に答える
2

重要なのは、ポストバック時に動的に作成されたコントロールをリロードする必要があることです。

そうしないと、null になり、値にアクセスできなくなります。

注:を使用する必要はありませんResponse.Write

これが例です。

<asp:Label runat="server" ID="Label1"></asp:Label>
<asp:Table runat="server" ID="table1"></asp:Table>
<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" 
   Text="Create TextBoxes" />
<asp:Button runat="server" ID="Button2" OnClick="Button2_Click" 
  Text="Submit" />

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        // Reload those control back. It can be in either init or load event.
        int total = Count;
        Label1.Text = total.ToString();

        for (int i = 0; i < total; i++)
            CreateTextBoxes(i);

        Count = total;
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    Count = Count++;
    CreateTextBoxes(Count);

    if (Count == 4)
    {
        Button1.Visible = false;
    }
}

protected void Button2_Click(object sender, EventArgs e)
{
    var results = new List<string>();
    foreach (TableRow row in table1.Rows)
    {
        foreach (TableCell cell in row.Cells)
        {
            var textBox = cell.Controls[0] as TextBox;
            if (textBox != null)
            {
                results.Add(textBox.Text);
            }
        }
    }
    Label1.Text += string.Join(",", results);
}

private int Count
{
    get { return Convert.ToInt32(ViewState["count"] ?? "0"); }
    set { ViewState["count"] = value; }
}

private void CreateTextBox(int j)
{
    var box = new TextBox();
    box.ID = "Textbox" + j;
    box.Text = "Textbox" + j;

    var c = new TableCell();
    c.Controls.Add(box);

    var r = new TableRow();
    r.Cells.Add(c);

    table1.Rows.Add(r);
}

出力

ここに画像の説明を入力

于 2013-07-11T20:02:07.747 に答える
0

asp.netの仕組みでは、boxポストバックごとに再作成しています(クリックButton1したときとクリックしたときの両方Button2)。をクリックButton2すると、 のコード ビハインドを実行した後でもButton1、まったく新しいbox.

では、追加したページ自体からButton2にアクセスするには、何かを行う必要があります。textbox私はあなたがやっていることをどのように扱うか前向きではありませんが、

var mytextBox = table1.Rows[x].Cells[y].Controls[z] as TextBox; // PSEUDOCODE
于 2013-07-11T19:29:18.390 に答える