【问题标题】:unable to add more than one server control dynamically in asp.net无法在 asp.net 中动态添加多个服务器控件
【发布时间】:2013-10-24 09:31:00
【问题描述】:

您好,这几天我一直在忙于我的一项开发任务,我无法弄清楚到底发生了什么。请帮忙。

我正在尝试将行动态添加到网页中,如下所示。 我想使用服务器控制。但我无法添加多于一行。

即使我使用了会话变量,也没有运气。请帮忙:)

-----------------aspx 文件---------------

<div>
    <asp:Table ID="tbl" runat="server">
        <asp:TableRow ID="rw0">
            <asp:TableCell ID="c01" Width="100px">
                <asp:CheckBox runat="server" ID="chk0" />
            </asp:TableCell>
            <asp:TableCell ID="c02" Width="100px">
                <asp:TextBox runat="server" ID="txt0" />
            </asp:TableCell></asp:TableRow>
        <asp:TableRow ID="rw1">
            <asp:TableCell ID="c11" Width="100px">
                <asp:CheckBox ID="chk1" runat="server" />
            </asp:TableCell><asp:TableCell ID="c12" Width="100px">
                <asp:TextBox runat="server" ID="txt1" />
            </asp:TableCell></asp:TableRow>
    </asp:Table>
    <asp:Button ID="btn1" runat="server" Text="Add Row" OnClick="addRow" />
</div>

---------------------C# 代码背后---------- -------

protected void addRow(object sender, EventArgs e)
    {

        int num_row = new int(); //checkpoint
        num_row = (tbl.Rows).Count;

        if (Session["tables"] != null)
        {
            tbl =  (Table)Session["tables"];
        }


        TableRow row = new TableRow();
        TableCell cell1 = new TableCell();
        TableCell cell2 = new TableCell();
        TextBox tb = new TextBox();
        CheckBox cb = new CheckBox();

        row.ID = "rw" + num_row;

        cell1.ID = "c" + num_row + "1";
        cell2.ID = "c" + num_row + "2";

        tb.ID = "txt" + num_row;
        tb.EnableViewState = true;
        cb.ID = "chk" + num_row;

        cell1.Controls.Add(tb);
        cell2.Controls.Add(cb);

        row.Cells.Add(cell1);
        row.Cells.Add(cell2);

        tbl.Rows.Add(row);
        Session["tables"] = tbl;


    }

【问题讨论】:

  • 您可以合并 num_row 变量的声明和赋值。
  • 你也可以使用ViewState,但是从表中你可以知道行数而不用保存在会话中。
  • 感谢很多人的快速回复。
  • Nzall,我不是很清楚。你能用代码表达吗.. :)
  • 尝试使用ListView控制并保留最后一行

标签: c# asp.net


【解决方案1】:

您每次只能看到添加一行,因为动态创建的控件在回发中不可用。

当您第一次单击添加行时,会发生回发,添加第三行。当您第二次单击添加行时,已添加的行将不可用,并再次添加新行。最后,您每次只能看到一行。

底线是您必须在 page_load 事件中每次回发时重新创建动态添加的控件,原因是动态添加的服务器子控件不会在回发中持续存在

也参考Why dynamically created user controls disappear when controls are not doing full postbacks?

要维护动态添加的控件的视图状态,您必须为控件生成 ID。在回发期间重新创建控件时,请使用相同的 id 重新创建它们,以便保持视图状态。

使用一些标准逻辑来生成控件的 ID。希望这会有所帮助。

更新:

protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                int num_row = (int)Session["No_of_Rows"];
                for (int i = 2; i < num_row; i++)
                {
                    TableRow row = new TableRow();
                    TableCell cell1 = new TableCell();
                    TableCell cell2 = new TableCell();
                    TextBox tb = new TextBox();
                    CheckBox cb = new CheckBox();

                    row.ID = "rw" + i;

                    cell1.ID = "c" + i + "1";
                    cell2.ID = "c" + i + "2";

                    tb.ID = "txt" + i;
                    tb.EnableViewState = true;
                    cb.ID = "chk" + i;

                    cell1.Controls.Add(cb);
                    cell2.Controls.Add(tb);

                    row.Cells.Add(cell1);
                    row.Cells.Add(cell2);

                    tbl.Rows.Add(row);
                }
            }
            else
            {
                Session["No_of_Rows"] = 2;
            }
        }

        protected void addRow(object sender, EventArgs e)
        {
            int num_row = (int)Session["No_of_Rows"]+1;
            TableRow row = new TableRow();
            TableCell cell1 = new TableCell();
            TableCell cell2 = new TableCell();
            TextBox tb = new TextBox();
            CheckBox cb = new CheckBox();

            row.ID = "rw" + num_row;

            cell1.ID = "c" + num_row + "1";
            cell2.ID = "c" + num_row + "2";

            tb.ID = "txt" + num_row;
            tb.EnableViewState = true;
            cb.ID = "chk" + num_row;

            cell1.Controls.Add(cb);
            cell2.Controls.Add(tb);

            row.Cells.Add(cell1);
            row.Cells.Add(cell2);

            tbl.Rows.Add(row);
            Session["No_of_Rows"] = tbl.Rows.Count;
        }

【讨论】:

  • 谢谢萨兰亚。但我不清楚创建 id 逻辑。我已经为上面代码中的每个控件创建了 id,并且我已经将整个存储在会话变量中。但仍然没有运气:(。请与我分享建议的代码更改。
  • 您好 Alwyn,我已编辑我的答案以反映所需的代码更改。我假设默认情况下您的表中有 2 行。您不需要将整个表存储在会话变量中,只需行数就足够了。请注意,作为您在文本框中提供的值的视图状态也会在回发中保持不变!
【解决方案2】:

在tale列输入值后如何保存数据库表中的所有值?

【讨论】:

  • 我希望你正在尝试如何访问动态创建的控件看看这个...read me
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2011-10-09
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多