动态创建控件在回发后丢失数据

Rea*_*eel 33 .net c# asp.net runtime

其实,我创建1 TextBoxPageload,并补充说TextBoxPanel.现在,我有一个LinkButton喜欢Add Another.

我正在输入文本,TextBox如果需要,我需要TextBox通过单击创建新建Add Another LinkButton.

实际上,我能够得到计数并重新创建TextBoxes.但是,问题在于,先前生成的我输入的文本Textboxes是丢失的.

任何人,建议我这个解决方案?

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 5; i++)
                {
                    TableRow row = new TableRow();
                    for (int j = 0; j < 5; j++)
                    {
                        TableCell cell = new TableCell();
                        TextBox tb = new TextBox();                        
                        tb.ID = "TextBoxRow_" + i + "Col_" + j;                        
                        cell.Controls.Add(tb);                        
                        row.Cells.Add(cell);
                    }                    
                    Table1.Rows.Add(row);
                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }        
    }
Run Code Online (Sandbox Code Playgroud)

这是一个示例代码,同样的代码写在Button_Click另外

 protected void ASPxButton1_Click(object sender, EventArgs e)
    {
 int k = Table1.Controls.Count;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个Count=0Button_Click.

Viv*_*vek 17

需要做的就是在回发期间每次都在页面加载事件之前或之内重新实例化/重新初始化动态控件,并将此控件添加到页面/表单/占位符.然后,通过父控件调用LoadPostData方法,将自动将发布的数据分配给控件.

查看文章以及如何编写动态控件代码 - 如何在asp.net中回发期间维护动态控件事件和数据

在此输入图像描述


R.C*_*R.C 14

使用动态控件时,必须记住它们只存在于下一个回发之前.ASP.NET不会重新创建动态添加的控件.如果需要多次重新创建控件,则应在PageLoad事件处理程序中执行控件创建(目前您只是第一次使用Condition:!IsPostabck创建TextBox).这样做的另一个好处是允许您在动态控件中使用视图状态.即使视图状态通常在Page.Load事件之前恢复,如果在PageLoad事件的处理程序中创建控件,ASP.NET将在PageLoad事件处理程序结束后应用它具有的任何视图状态信息.

所以,删除条件:!IsPostback,这样每次页面加载时,TextBox控件也会被创建.在PageLoad处理程序完成后,您还将看到保存文本状态框.[显然你没有禁用ViewState !!! ]

例:

protected void Page_Load(object sender, EventArgs e)
{

    TextBox txtBox = new TextBox();
    // Assign some text and an ID so you can retrieve it later. 

    txtBox.ID = "newButton";
    PlaceHolder1.Controls.Add(txtBox);

}
Run Code Online (Sandbox Code Playgroud)

现在运行它之后,在文本框中键入任何内容,看看当您单击任何导致回发的按钮时会发生什么.文本框仍然保持其状态!

  • 你能详细说明ViewState及其对动态控件的影响吗? (2认同)

Adi*_*dil 7

动态生成的控件不保持状态.你必须自己维护它.您可以使用一些隐藏字段来保持控件的状态,这将在服务器端用于提取状态.Asp.net使用隐藏字段来维护请求之间的状态,您可以__VIEWSTATE在源代码中看到.

在ASP.NET页面中,视图状态表示在服务器上次处理页面时的状态.它用于构建调用上下文,并在同一页面的两个连续请求中保留值.默认情况下,使用添加到页面的隐藏字段在客户端上持久保存状态,并在处理页面请求之前在服务器上恢复状态.视图状态与页面本身来回传播,但不表示或包含与客户端页面显示相关的任何信息,参考.