0

私は非常に厄介な問題を抱えており、いくつかの助けをいただければ幸いです。
私は動的にテキスト ボックスを作成しています。ボタンを使用して別のテキスト ボックスを作成し、最後のテキスト ボックスに挿入されたテキストを保存します。問題は、ボタンのハンドラー イベントが呼び出されたときに、ページの読み込みが前に呼び出され、ページを再作成することです。
その後、作成した動的テキスト ボックスが失われます。テキストボックスまたはそのIDをセッションに保存しようとしましたが、ページの読み込みが前に呼び出されたため、最後のテキストボックスにテキストを取得できないという問題がありました。

ページの読み込み前にテキストを保存するにはどうすればよいですか? または、ページの読み込みをキャンセルしてページを再度作成することはできますか?

ここにコードを追加しました:

int i = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["orderList"] = null;
        }
    }

    public void create()
    {
            List<Order> orderList = (List<Order>)Session["orderList"];    // get the order list
            TextBox1.Text = orderList[0].Number_Of_Items.ToString();
            TextBox2.Text = orderList[0].PricePerItem;

            for (i = 1; i < orderList.Count; i++)
            {
                Label lb = new Label();
                lb.ID = "lb" + i.ToString();
                lb.Text = "item" + (i + 1).ToString() + ":";
                Panel1.Controls.Add(lb);

                DropDownList ddl = new DropDownList();
                ddl.ID = "ddl" + i.ToString();
                ListItem li = new ListItem();
                li.Text = "12345";
                li.Value ="5";
                ddl.Items.Add(li);
                Panel1.Controls.Add(ddl);

                Label lb2 = new Label();
                lb2.ID = "lb2" + i.ToString();
                lb2.Text = "Amount:";
                Panel1.Controls.Add(lb2);

                TextBox tb = new TextBox();
                tb.ID = "tb" + i.ToString();
                tb.Width = 110;
                tb.Text = orderList[i].Number_Of_Items.ToString();
                Panel1.Controls.Add(tb);

                Label lb3 = new Label();
                lb3.ID = "lb3" + i.ToString();
                lb3.Text = "Price Per Item:";
                Panel1.Controls.Add(lb3);

                TextBox tb1 = new TextBox();
                tb1.ID = "tb" + i.ToString();
                tb1.Width = 110;
                tb1.Text = orderList[i].PricePerItem;
                Panel1.Controls.Add(tb1);

                Panel1.Controls.Add(new LiteralControl("<br><br>"));
            }

            // Adding another empty order 

            Label lbLast = new Label();
            lbLast.ID = "lbLast";
            lbLast.Text = "item" + (i + 1).ToString() + ":";
            Panel1.Controls.Add(lbLast);

            DropDownList ddlLast = new DropDownList();
            ddlLast.ID = "ddlLast";
            ListItem liLast = new ListItem();
            liLast.Text = "12345";
            liLast.Value = "5";
            ddlLast.Items.Add(liLast);
            Panel1.Controls.Add(ddlLast);

            Label lbLast1 = new Label();
            lbLast1.ID = "lbLast1";
            lbLast1.Text = "Amount:";
            Panel1.Controls.Add(lbLast1);

            TextBox tbLast = new TextBox();
            tbLast.ID = "tbLast" + (i + 1).ToString();
            tbLast.Width = 110;
            Panel1.Controls.Add(tbLast);

            Label lbLast2 = new Label();
            lbLast2.ID = "lbLast2";
            lbLast2.Text = "Price Per Item:";
            Panel1.Controls.Add(lbLast2);

            TextBox tbLast1 = new TextBox();
            tbLast1.ID = "tbLast1";
            tbLast1.Width = 110;
            Panel1.Controls.Add(tbLast1);
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        List<Order> list = new List<Order>();
        Order order = new Order();

        if (Session["orderList"] == null)      // takes data from .aspx
        {
            order.Number_Of_Items = Int32.Parse(TextBox1.Text);
            order.PricePerItem = TextBox2.Text;

            list.Add(order);
            Session["orderList"] = list;
            List<Order> orderList = (List<Order>)Session["orderList"];
            create();
        }
        else    // takes data from last order
        {

            list = (List<Order>)Session["orderList"];
            order.Number_Of_Items = list.Last().Number_Of_Items;
            order.PricePerItem = list.Last().PricePerItem;
            list.Add(order);
            Session["orderList"] = list;
            create();
        }
    }


<asp:Panel ID="Panel1" runat="server">
<asp:Label ID="Label1" runat="server" Text="Item1:"></asp:Label>
<asp:DropDownList ID="DropDownList2" runat="server">
    <asp:ListItem Value="1">BBB</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label3" runat="server" Text="Amount:"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Width="110px"></asp:TextBox>
<asp:Label ID="Label4" runat="server" Text="Price Per Item:"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server" Width="110px"></asp:TextBox>
<br /><br />

強いテキスト

4

1 に答える 1

0

作成(); すべてのポストバックで呼び出す必要があります。これにより、動的に作成されたすべてのコントロールが再作成され、その値も維持されます。

これが、あなたがやろうとしていることを実行するコードです。

    int i = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["Orders"] = 1;
        }
        else
        {
            create();
        }
    }

   public void create()
    {
        for (i = 0; i < (int)Session["Orders"]; i++)
        {
            Label lb = new Label();
            lb.ID = "lb" + i.ToString();
            lb.Text = "item" + (i + 1).ToString() + ":";
            Panel1.Controls.Add(lb);

            DropDownList ddl = new DropDownList();
            ddl.ID = "ddl" + i.ToString();
            ListItem li = new ListItem();
            li.Text = "12345";
            li.Value = "5";
            ddl.Items.Add(li);
            Panel1.Controls.Add(ddl);

            Label lb2 = new Label();
            lb2.ID = "lb2" + i.ToString();
            lb2.Text = "Amount:";
            Panel1.Controls.Add(lb2);

            TextBox tb = new TextBox();
            tb.ID = "tb" + i.ToString();
            tb.Width = 110;
            Panel1.Controls.Add(tb);

            Label lb3 = new Label();
            lb3.ID = "lb3" + i.ToString();
            lb3.Text = "Price Per Item:";
            Panel1.Controls.Add(lb3);

            TextBox tb1 = new TextBox();
            tb1.ID = "tb1" + i.ToString();
            tb1.Width = 110;
            Panel1.Controls.Add(tb1);

            Panel1.Controls.Add(new LiteralControl("<br><br>"));
        }

    }


    protected void Button1_Click(object sender, EventArgs e)
    {
           Session["Orders"] = (int)Session["Orders"] + 1;
    }
于 2013-08-23T14:16:02.307 に答える