动态文本字段不会在回发时保留数据

时间:2012-04-12 16:04:30

标签: c# asp.net controls dynamic-controls

我创建了一个允许用户动态添加更多文本框的webform。现在,当单击按钮添加另一个字段时,它会自动回发。控件添加在Pre_Init中。但是,当页面重建自身时,文本框名称每次都不同,因此每次回发都不会保留数据。

protected void Page_PreInit(object sender, EventArgs e)
{

    MasterPage master = this.Master; //had to do this so that controls could be added. 
    createNewTextField("initEnumValue",true);
    RecreateControls("enumValue", "newRow");
}
private int FindOccurence(string substr)
{
    string reqstr = Request.Form.ToString();

    return ((reqstr.Length - reqstr.Replace(substr, "").Length) / substr.Length);
}
private void RecreateControls(string ctrlPrefix, string ctrlType)
{
    string[] ctrls = Request.Form.ToString().Split('&');
    int cnt = FindOccurence(ctrlPrefix);
    //Response.Write(cnt.ToString() + "<br>");
    if (cnt > 0)
    {
        for (int k = 1; k <= cnt; k++)
        {
            for (int i = 0; i < ctrls.Length; i++)
            {
                if (ctrls[i].Contains(ctrlPrefix  + k.ToString()) && !ctrls[i].Contains("EVENTTARGET"))
                {
                    string ctrlID = ctrls[i].Split('=')[0];

                    if (ctrlType == "newRow")
                    {

                        createNewTextField(ctrlID,false);
                    }
                    break;
                }
            }
        }
    }
}
protected void addEnum_Click(object sender, ImageClickEventArgs e)
{

    int cnt = FindOccurence("enumValue");
    createNewTextField("enumValue" + Convert.ToString(cnt + 1),false);
   // Response.Write(cnt.ToString() + "<br>");
}
private void createNewTextField(string ID, bool button)
{
    Response.Write(ID + "<br/>"); //this is where I'm getting different names each time there is a postback
    if (ID != "initEnumValue") //create new line starting with the second tb. 
    {
        LiteralControl newLine = new LiteralControl();
        newLine.Text = "<br />";
        this.plhEnum.Controls.Add(newLine);
    }



    TextBox newTb = new TextBox();
    newTb.ID = ID;
    this.plhEnum.Controls.Add(newTb);

    if (button) //create the button only on the first one. 
    {
        LiteralControl space = new LiteralControl();
        space.Text = "&nbsp;";
        this.plhEnum.Controls.Add(space);
        ImageButton imgbutton = new ImageButton();
        imgbutton.ID = "addEnum";
        imgbutton.ImageUrl = "~/images/add.png";
        imgbutton.Click += new ImageClickEventHandler(addEnum_Click);
        imgbutton.CausesValidation = false;

        this.plhEnum.Controls.Add(imgbutton);
    }

    //endEnumRow();
    //this.plhEnum.Controls.Add(newTb);
}

我尝试过这个解决方案How can I get data from dynamic generated controls in ASP .NET MVC?

0 个答案:

没有答案