我定義了兩個使用者控制項。
Definition1 =(Definition) Page.LoadControl("ModuleControl/Definition.ascx");
RightDefine1 = (RightDefine) Page.LoadControl("RightControl/RightDefine.ascx");
根據頁面的radio選擇不同的使用者控制項載入,
private void Page_Load(object sender, System.EventArgs e)
{
// Response.Write(ModuleType.ToString()+"select<br>");
// Response.Write(ViewType_txt.Text+"select<br>");
//
if(ModuleType.ToString()!=ViewType_txt.Text)
{
WebPart.EnableViewState = false;
ViewType_txt.Text = ModuleType.ToString();
//
// _pageModule = Request.QueryString["PageModule"];
// if(_pageModule!="")
// Response.Redirect(Request.Url+"?PageModule="+((int)ModuleDetail).ToString());
}
WebPart.Controls.Clear();
switch(ModuleType)
{
case (int)LoadContent.ModuleDetail:
Definition1 =(Definition) Page.LoadControl("ModuleControl/Definition.ascx");
Definition1.PostShowCatalog +=new AuthorWeb.Web.ModuleControl.Definition.ShowCatalogEventHandler(Definition1_PostShowCatalog);
ModuleCatalog1.SelectedCatalog +=new AuthorWeb.Web.ModuleControl.ModuleCatalog.SelectCatalogEventHandler(ModuleCatalog1_SelectedCatalog);
Definition1.ID = "ID_Define";
WebPart.Controls.Add(Definition1);
// Response.Write("add define control<br>");
break;
case (int)LoadContent.ModuleRightDetail:
RightDefine1 = (RightDefine) Page.LoadControl("RightControl/RightDefine.ascx");
RightDefine1.ID = "ID_RightDefine";
WebPart.Controls.Add(RightDefine1);
ModuleCatalog1.SelectedCatalog +=new AuthorWeb.Web.ModuleControl.ModuleCatalog.SelectCatalogEventHandler(ModuleCatalog1_SelectedCatalog_byRight);
break;
}
}
使用者在幾次使用中都會遇見:
未能載入檢視狀態。正在向其中載入檢視狀態的控制項樹必須與前一請求期間用於儲存檢視狀態的控制項樹相匹配。例如,當以動態方式添加控制項時,在回傳期間添加的控制項必須與在初始請求期間添加的控制項的類型和位置相匹配。
關於這個問題的討論有:
http://www.cnblogs.com/airforce1st/archive/2004/08/27/36973.aspx
http://blog.joycode.com/ghj/archive/2004/04/16/19768.aspx
這個問題的出現,我認為就是ViewState造成的。
在回傳時候,使用者試圖去載入第二個控制項的時候,由於第一控制項仍有ViewState存在,服務端會嘗試去恢複已經不存在的使用者控制項的狀態(或事件),結果,出現這種問題。
我作了一些嘗試:
比如在載入不同的使用者控制項的時候,將PlaceHolder的EnableViewState = false;
給使用者控制項加上定義的id:
Definition1.ID = "ID_Define";
WebPart.Controls.Add(Definition1);
但是,啟動並執行時候還是有問題。
最後實在沒有辦法,在同事ben的協助下,加了一行代碼,解決了問題。
我們一致認為這個是微軟的bug
這行代碼是什麼呢??
WebPart.Controls.Add(new Label());//it is
WebPart.Controls.Add(RightDefine1);
本文續:
http://www.cnblogs.com/king_astar/archive/2005/06/01/165763.html