先贴代码。 <form id="form1" runat="server">
    <%= strTestHtml%>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
 </form>    public String strTestHtml;    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            strTestHtml = "<input type=\"text\" name=\"t1\">";
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        String strTest = ConvertUtility.ToNonNullString(Request.Form["t1"]);
        MsgUtility.RegisterErrorScript(this, strTest);
        return;
    }
因为strTestHtml里面的input个数不确定,所以不能用textbox来做,我需要的是Button1_Click事件后页面还能显示strTestHtml并且用户输入的值还保留。我试过用ajax的方法来做,没搞通。试过UpdatePanel,但是对这个不熟,也不行。请大家出谋划策,谢谢!

解决方案 »

  1.   

    用ajax搞,别用UpdatePanel控件,用jq或者prototype 去操作。
      

  2.   

       if (!IsPostBack)
            {
                strTestHtml = "<input type=\"text\" name=\"t1\">";
            }
    画控件这种事情.. 不要放在里面..
       protected void Page_Load(object sender, EventArgs e)
        {
             strTestHtml = "<input type=\"text\" name=\"t1\">";        if (!IsPostBack)
            {
                        }
        }
      

  3.   


    因为控件的个数和属性都是从数据库里面读出来的,所以这个完全放在客户端用ajax做是有问题的。
    我现在提交以后,服务端也是先从数据库获得控件的个数和属性,然后Request.Form。
      

  4.   

    2楼的方法可以在点击以后还存在的,如果想保存原来的值的,就得做些额外的操作的
    简单的就是把现有的值保存起来的,然后再show出来的
      

  5.   


    问题就在于这存值上,如果把所有的值都存放在Session里面,有点恐怖。
      

  6.   

    另外去掉postback后服务端获取值还有问题。
      

  7.   

    把strTestHtml
    放在中,
    <asp:literal id="xxx" runat="sever" />
    如  xxx.Text=strTestHtml;
    开启页面的viewstate,literal是web服务器控件,按道理应该可以保留.
      

  8.   

    strTestHtml = "<input type=\"text\" name=\"t1\">";
    if (!IsPostBack){}动态添加回传控件会丢失,还要通过viewstate保存相关值。保持其持久性
    JS添加
      

  9.   

                                                    HtmlTextArea theInput_TEXTAREA = new HtmlTextArea();
                                                    theInput_TEXTAREA.ID = theRow["ID"].ToString();
                                                    theInput_TEXTAREA.Style.Add("position", "absolute");
                                                    theInput_TEXTAREA.Style.Add("left", theRow["INPUT_X"].ToString() + "px");
                                                    theInput_TEXTAREA.Style.Add("top", theRow["INPUT_Y"].ToString() + "px");
                                                    theInput_TEXTAREA.Rows = Convert.ToInt16(theRow["INPUT_H"].ToString());
                                                    theInput_TEXTAREA.Cols = Convert.ToInt16(theRow["INPUT_W"].ToString());
                                                    theInput_TEXTAREA.Style.Value = theInput_TEXTAREA.Style.Value + theRow["INPUT_CSS"];
                                                        if (theString == theRow["REDONLE"].ToString())
                                                        {
                                                            theInput_TEXTAREA.Attributes.Add("readonly", "readonly");
                                                        }
                                                                                                            theInput_TEXTAREA.Value = the_value;();                                                theDrawDiv.Controls.Add(theInput_TEXTAREA);我是用这种方式来构造控件,先保存后重绘。保存时用                                                HtmlInputText theInput_TEXT = (HtmlInputText)theDrawDiv.FindControl(theRow["ID"].ToString());这样的方法得到构造的控件。
      

  10.   


    测试过,postback后空间还在,但是用户填写的值不在了。
      

  11.   


    请问如何对构造的空间启用viewstate?
      

  12.   


    貌似和构造控件的方式关系不大,我测试了你的方法,和我直接html构造空间问题一样。
      

  13.   

    09年的一个帖子http://topic.csdn.net/u/20090325/12/4F891768-01AE-4B03-8A68-1F833964BF1E.html
      

  14.   


    你直接用html中间隔代码的方法生成的控件,并不是服务器端控件。
    我的这种方法,如果你在Page_Load中每次都生成同样的控件时,上次生成的控件值是可以传递过来的。
      

  15.   

    有个变通的方法:放一个hidden "<input type=\"text\" name=\"t1\">";这里的值用“,”隔开。然后page_load的时候,把值重新赋值