TabContainer选项卡使用,动态创建选项卡

项目测试过后,发现有个页面加载很慢。查啊查啊,总算查到是那部分代码占了不少时间。嗯,客户要求高,没办法,只好优化啊。我做的是动态创建TAB选项卡,再根据TAB选项卡的标题,动态创建Gridview 。刚开始不会做,查了好久,发现个不错的文章:
   搞不懂为什么AJAX Control Toolkit 的Tab控件为什么不提供TabPanel切换时可设置回传或回调。我就要需要这个功能:当在TabPanel切换时,实现动态加载TabPanel里的内容。   
      Google了不少网页,看了不少的文章,好几次冲动地想自己把功能做出来,可抱着别人也应该会遇到这个问题的幻想,终于老天不负有心人,给我打到了答案。似乎找不到中文版的解决方案,可英文版竟然找到了。    
答案在这个网址里: http://www.codeplex.com/AtlasControlToolkit/WorkItem/View.aspx?WorkItemId=7739    
不想看E文的话,我这里说下:    
    1。在UpdatePanel里加上这个:
<triggers>
       <asp:AsyncPostBackTrigger ControlID="tabContainer" EventName="ActiveTabChanged" /> </triggers>   
    2。在aspx网页上加上这个客户端脚本:
    function ActiveTabChanged(sender, e)
    {
         <%= Page.ClientScript.GetPostBackEventReference(TabContainer, String.Empty) %>
    }
    function ActiveTabChanged(sender, e)
   {
      __doPostBack('<%= TabContainer.ClientID %>', sender.get_activeTab().get_headerText());
   }  
  
    3。在Tab控件加上这个属性: OnClientActiveTabChanged="ActiveTabChanged"    
   
    4。在Page_Load事件里加: ScriptManager1.RegisterAsyncPostBackControl(TabContainer); 注意:将以上的“TabContainer”替换为你自定的tab控件ID
TabContainer要实现服务器端回传,出来在后台实现 OnActiveTabChanged 事件外, 还需要在前台实现 OnClientActiveTabChanged 事件,这是关键。
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true">    
<contenttemplate>
            <ajaxToolkit:TabContainer runat="server" ID="Tabs" Height="480px" Width="100%"            
            OnClientActiveTabChanged="activeTabChanged"           
            OnActiveTabChanged="Tabs_ActiveTabChanged">
            <ajaxToolkit:TabPanel runat="Server" ID="Panel1" HeaderText="我的消息">                 <ContentTemplate>               
                 ***                
               </ContentTemplate>            
            </ajaxToolkit:TabPanel>          
     
           <ajaxToolkit:TabPanel runat="Server" ID="Panel2" HeaderText="已发消息">

                <ContentTemplate>                
                ***               
              </ContentTemplate>            
        </ajaxToolkit:TabPanel>        
    </ajaxToolkit:TabContainer>    
</contenttemplate>    
<triggers>        
<asp:AsyncPostBackTrigger ControlID="Tabs" EventName="ActiveTabChanged" />    
</triggers>
</asp:UpdatePanel>

<script language="javascript" type="text/jscript">

function activeTabChanged(sender, e)
{    
      __doPostBack('<%= Tabs.ClientID %>', sender.get_activeTabIndex());
}
</script>
后台.cs代码:
protected void Tabs_ActiveTabChanged(object sender, EventArgs e) {   
switch (Tabs.ActiveTabIndex)  
{      
case 0: BindGrid();           
break;       
case 1: BindGrid2();           
break;       
case 2: Message.Text = "";          
break;      
default: break;   
} }
本以为照着做,应该可以顺利做出来,可是没想到却报错:
提示信息:
Sys.WebForms.PageRequestManagerTimeoutException:The server request time out.
Ajax控件总是奇奇怪怪的出现异常。哎,接着查吧,终于查出:
这样就可以解决。具体可以看:
http://forums.asp.net/p/1042916/1459117.aspx
<asp:scriptmanager AsyncPostBackTimeOut="36000" runat="server">
当然我还遇到了又一个问题:报错:
Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. Details: Error parsing near '
具体解决方法我就不多说了,想知道解决办法的话,请看
http://www.dezai.cn/article_show.asp?ArticleID=27039
我也试了,好像也不好用。呵呵,可能是我逻辑错误,我改了部队代码就不报这样的错了。
http://www.cnblogs.com/dongyongjing/archive/2007/03/20/681411.html
  由于我是动态创建控件,当然也遇到了动态删除控件。我本以为按顺序做,就不出错了。先删除旧的控件,再创建新的,可是却又报错:
未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。
这个问题的出现,我认为就是ViewState造成的。
在回发时候,用户试图去加载第二个控件的时候,由于第一控件仍有ViewState存在,服务端会尝试去恢复已经不存在的用户控件的状态(或事件),结果,出现这种问题。
我作了一些尝试:
比如在加载不同的用户控件的时候,将PlaceHolder的EnableViewState = false;
给用户控件加上定义的id:
     Definition1.ID = "ID_Define";
     WebPart.Controls.Add(Definition1);
但是,运行的时候还是有问题。
具体解决办法,参看:
http://www.cnblogs.com/king_astar/archive/2005/06/01/165763.html
http://www.cnblogs.com/king_astar/archive/2004/11/08/52322.html
呵呵,我看还是这里全点:
http://www.cnblogs.com/airforce1st/archive/2004/08/27/36973.aspx
哦,对了,我还遇到了问题:
在使用主题的时候出现 控件包含代码块(即 ),因此无法修改控件集合错误,原来错误的原因是:
控件包含代码块(即 ),因此无法修改控件集合。 将这些代码去掉,相应的功能在代码中实现即可。
造成这个错误的原因是:在 里面,使用了类似这样的代码,
把Head中使用的的脚本放到body中,就OK了.
不过,建议看下页面的执行顺序:
http://blog.csdn.net/newmcz/archive/2008/09/10/2908324.aspx
页面事件(Init,Load,PreRender)执行顺序(转)
http://hi.baidu.com/zpylh_hust/blog/item/50e4c30fc56a06ebab645787.html
经过这两天的反复尝试,终于搞定了,这个页面不再加载很慢了。最后,Ajax里Tab选项卡还是可以改变原有样式的。具体的,网上有很多,我就不多说了。给个提示:
http://www.cnblogs.com/htht66/archive/2008/08/20/1104765.html
http://hi.baidu.com/haofefe/blog/item/80b425fa70b7271ba8d311a7.html
http://www.cnblogs.com/luohuarenduli/archive/2008/05/09/1189968.html

解决TabContainer选项卡文字显示不全的问题(AJAX提供的默认XP样式)
http://hi.baidu.com/diudiu_mei/blog/item/235f62ced623c80793457ee2.html

你可能感兴趣的:(职场,动态,休闲,选项,TabContainer)