我在GridView中的        protected void gvDepartment_PreRender(object sender, EventArgs e)
        {
            for (Int32 i = 0; i <= gvDepartment.Rows.Count - 1; i++)
            {
                GridViewRow row = gvDepartment.Rows[i];
                Button btnDelete = (Button)row.FindControl("btnDelete");
                System.Web.UI.HtmlControls.HtmlAnchor btnPrompt = new System.Web.UI.HtmlControls.HtmlAnchor();
                btnPrompt.EnableViewState = false;
                btnPrompt.InnerHtml = btnDelete.Text;
                btnPrompt.HRef = "javascript:";
                btnDelete.Parent.Controls.AddAt(btnDelete.Parent.Controls.IndexOf(btnDelete), btnPrompt);
            }
        }然后在页面中有提交控件点击的时候就提示

未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配

在网上找了一些方法都不行
比如说:
解决:在页面的  Page 项添加 EnableViewState="false" 即可,是不是很简单啊。
----------------------
但这样的话:这种办法,不好啊,这样所有的控件状态都保存不了啦那要怎么办呢谢谢

解决方案 »

  1.   

    正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配 
    --------------------------------------------------------------------你可以设置GridView的EnableViewState="false" 或者设置btnPrompt.EnableViewState = true;
      

  2.   


    你可以设置GridView的EnableViewState="false" 或者设置btnPrompt.EnableViewState = true; 
      

  3.   

    你可以设置GridView的EnableViewState="false" 
    ---------------------------------
    这种方式不行,应该我要保持我的gvDepartment状态设置btnPrompt.EnableViewState = true;
    还是一样的出错提示
    谢谢        protected void gvDepartment_PreRender(object sender, EventArgs e)
            {
                for (Int32 i = 0; i <= gvDepartment.Rows.Count - 1; i++)
                {
                    GridViewRow row = gvDepartment.Rows[i];
                    Button btnDelete = (Button)row.FindControl("btnDelete");
                    System.Web.UI.HtmlControls.HtmlAnchor btnPrompt = new System.Web.UI.HtmlControls.HtmlAnchor();
                    btnPrompt.EnableViewState = true;  //这里已经设置
                    btnPrompt.InnerHtml = btnDelete.Text;
                    btnPrompt.HRef = "javascript:";
                    btnDelete.Parent.Controls.AddAt(btnDelete.Parent.Controls.IndexOf(btnDelete), btnPrompt);
                }
            }
      

  4.   

    问题出在btnDelete.Parent.Controls.AddAt(btnDelete.Parent.Controls.IndexOf(btnDelete), btnPrompt);
    的AddAt。在你的btnDelete前面放一个PlaceHolder,例如ID为myContainer,然后把它写为类似于:
    var cc=(PlaceHolder)row.FindControl("btnDelete");
    cc.Controls.Add(btnPrompt);
      

  5.   

    哦,id写错了,应该是var cc=(PlaceHolder)row.FindControl("myContainer");
    cc.Controls.Add(btnPrompt);
      

  6.   

    出现这种错误,就肯定是你动态改变控件树时不小心改错了。举个例子,例如原来是这样的:
    HtmlForm
    - TextBox
    - Button在PostBack之后,变成了这个样子:
    HtmlForm
    - Button
    - TextBox这时候ASP.NET会尝试把原本TextBox的ViewState塞进Button,发现塞不进,属性完全对不上,就会出这个错误。你需要解决的话,打开Trace,然后看看Trace输出的控件树是什么地方不同了,再看看你的代码,估计就能看出哪里不小心破坏控件树了。
      

  7.   

    你只要不动态的添加btnPrompt就可以了..让它原来就在,但是不显示,在你的代码中再显示出来
      

  8.   

    我这里是一个GridView里面的一行
    我要根据他里面行的控件的某一个属性来别加某一个控件
    要添加的控件是不定的
    所以我就想动态来添加
    而如果要事先加好的话我要加好多个控件啊上面应该怎么办呢
    谢谢
      

  9.   


    为你在C#中new出来的所有控件加上ID属性。我上面已经说过问题所在了,就是同样的ID不同的控件。由于你没有对控件ID赋值,所以ID是自动编号的,这次的ctrl00是TextBox,下次的ctrl00是Button,ASP.NET就一定报错。只要你用ID区分了控件,自然不会出这样的问题。
      

  10.   

    我的这个问题解决了,是我分页回发时。分页处理过后,然后有一个if 判断 为false 时就直接retrun 了而没有重新绑定数据,哎。该仔细了粗心错误。惭愧