1

下面是aspx中的控件。

 <asp:UpdatePanel runat="server" ID="panel" ChildrenAsTriggers="false" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:PlaceHolder runat="server" ID="holder"></asp:PlaceHolder>
            <asp:Button runat="server" ID="bt" Text="Add" onclick="AddTxt" />
            <asp:Button runat="server" ID="btn1" Text="Refresh" onclick="btn1_Click" />
        </ContentTemplate>

当单击按钮添加时,我正在创建一个动态表。下面是 C# 代码

protected void AddTxt(object sender, EventArgs e)
{
    int tblRows = 3;
    int tblCols = 3;

    Table tbl = new Table();

    for (int i = 0; i < tblRows; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < tblCols; j++)
        {
            TableCell tc = new TableCell();
            TextBox txtBox = new TextBox();
            txtBox.ID = "txt" + i.ToString() + j.ToString();
            //txtBox.TextChanged += new EventHandler(txt_TextChanged);
            tc.Controls.Add(txtBox);

            tr.Cells.Add(tc);

            if (Session["ctls"] != null)
            {
                Session["ctls"] += ";t";
            }
            else
            {
                Session["ctls"] = "t";
            }
        }

        tbl.Rows.Add(tr);
    }

    holder.Controls.Add(tbl);

    panel.Update();

}

当单击刷新按钮时发生部分回发时,我无法获取用户在文本框中更新的值。控件将具有空文本。

protected void Page_Load(object sender, EventArgs e)
{
    foreach (Control c in holder.Controls)
    {
        if (c is TextBox)
        {

        }

    }
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    if (Session["ctls"] != null)
    {
        string[] ctls = Session["ctls"].ToString().Split(';');
        foreach (string ctlType in ctls)
        {
            if (string.Compare(ctlType, "t") == 0)
            {
                holder.Controls.Add(new TextBox());
            }
        }
    }
}

任何人都可以帮助/给我一个提示如何解决更新面板内的动态控件。

4

2 回答 2

2

下面是更正后的代码,现在运行良好。我在这里添加它是因为它可能对某些人有所帮助。

 protected void AddTxt(object sender, EventArgs e)
{
    add();

}
private void add()
{
    int tblRows = 3;
    int tblCols = 3;

    Table tbl = new Table();

    for (int i = 0; i < tblRows; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < tblCols; j++)
        {
            TableCell tc = new TableCell();
            TextBox txtBox = new TextBox();
            txtBox.ID = "txt" + i.ToString() + j.ToString();
            //txtBox.TextChanged += new EventHandler(txt_TextChanged);
            tc.Controls.Add(txtBox);

            tr.Cells.Add(tc);

        }

        tbl.Rows.Add(tr);
    }

    holder.Controls.Add(tbl);

    if (Session["ctls"] != null)
    {
        Session["ctls"] += ";t";
    }
    else
    {
        Session["ctls"] = "t";
    }

    panel.Update();
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    if (Session["ctls"] != null)
    {
        string[] ctls = Session["ctls"].ToString().Split(';');


        foreach (string ctlType in ctls)
        {

            if (string.Compare(ctlType, "t") == 0)
            {
                add();
            }
        }
    }
}
于 2013-07-25T04:42:29.153 回答
2

AddTxt问题是,当您在为文本框分配值的方法中动态创建控件(表格、行、单元格、文本框)ID时,但是当您在OnInit事件中动态创建控件时,您根本没有创造ID价值,因此ViewState无法连接到用户输入的内容并因此丢失。

如果您使用与其他动态控件创建逻辑中相同的ID值 ( ) 创建文本框,那么您的值将被保留并在重新创建文本框时正确应用于文本框。txtBox.ID = "txt" + i.ToString() + j.ToString();ViewStateOnInit

注意:ViewState很大程度上依赖于ID服务器控件的值,以便在完整和部分回发之间正确关联控件的值。

于 2013-07-25T04:18:22.040 回答