【问题标题】:Get the value of dynamically added text box from table inside update panel从更新面板内的表格中获取动态添加的文本框的值
【发布时间】:2013-07-25 04:03:39
【问题描述】:

下面是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());
            }
        }
    }
}

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

【问题讨论】:

    标签: c# asp.net updatepanel


    【解决方案1】:

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

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

    注意:ViewState 严重依赖于服务器控件的ID 值,以便在全部和部分回发之间正确关联控件的值。

    【讨论】:

    • 感谢您的快速回复。你的意思是我必须在 init() 上再次创建具有相同控件的同一个表?
    • @Naveen - 是的,这是正确的。服务器控件和 ViewState 并不总是方便的现实。这就是人们开始不喜欢 ASP.NET WebForms 模型的原因,尤其是当您开始在代码中注入越来越多的 AJAX 功能时。 ASP.NET 页面生命周期和 AJAX 往往会发生冲突。 :-(
    • @ Karl Anderson 当我调用创建表 AddTxt() 的相同方法时,它给了我错误! “Microsoft JScript 运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:找到了具有相同 ID 'txt00' 的多个控件。FindControl 要求控件具有唯一 ID。”
    • 糟糕,对不起,我的错。我在每个文本框创建时都添加到会话中,我必须为表创建一个会话。它现在工作得很好。感谢卡尔的宝贵意见。你救了我一天。
    • @Naveen - 太好了,很高兴它对你有用。如果您觉得这个答案对您有所帮助,请随时接受。
    【解决方案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();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多