ASP.NET AJAX Advance Tips & Tricks (8) 扩展AJAX Control Toolkit中的控件

前言:

AJAX Control Toolkit 是Open Source的(将包含到最新的VS2010中,届时可能不再开源),我们可以容易地修改其源代码来扩展原有的控件,使之拥有新的功能,达到我们的预定需求。在本文中,我们以为TabPanel控件添加Disabled功能为例,向大家演示如何简单地扩展AJAX Control Toolkit中的控件。

需求:

TabContainer容器中的TabPanel类本身就包含了Enabled属性,也可以使用JavaScript方法set_enabled(X)来设置Enabled属性,如果某个TabPanel的这个属性为false的话,这个TabPanel就不会显示在TabContainer中,这与一般控件的“Enabled”属性不太一样,我认为叫它“Visiable”会更加恰当。如下图所示:

有时候这并不符合我们的需求,所以,在本例中,我们将为其添加Disabled功能,使TabPanel控件可以变成灰色,而不响应客户端事件。

 

1. 添加服务端属性:

首先我们找到TabPanel.cs也就是TabPanel类,在其中添加如下属性来代表TabPanel是“恢复启用”还是“变灰禁用”状态:

复制代码
        [DefaultValue( "" )]
        [Category(
" Behavior " )]
        [ExtenderControlProperty]
        [ClientPropertyName(
" disabled " )]
        
public   bool  Disabled 
        {
            
get  {  return  ( bool )(ViewState[ " Disabled " ??   false ); }
            
set  { ViewState[ " Disabled " =  value; }
        }

        
internal   bool  Active
        {
            
get  {  return  _active; }
            
set  { _active  =  value; }
        }
复制代码

 

在属性中,我们设置ClientPropertyName为“disabled”,也就是将这个属性映射到JavaScript Behavior代码中的_disabled属性,并以ViewState为状态保存容器。

 

2. 添加客户端属性

由于AJAX Control Toolkit中的控件行为大都是由JavaScript Behavior实现的,接下来,我们向Tab控件相应的JavaScript Behavior中添加客户端属性。

找到AjaxControlToolkit.TabPanel 的定义,添加上面提到的_disabled成员变量,如下:

复制代码
AjaxControlToolkit.TabPanel  =   function (element) {
    AjaxControlToolkit.TabPanel.initializeBase(
this , [element]);
    
this ._active  =   false ;
    
this ._tab  =   null ;
    
this ._headerOuter  =   null ;
    
this ._headerInner  =   null ;
    
this ._header  =   null ;
    
this ._owner  =   null ;
    
this ._enabled  =   true ;
    
this ._disabled  =   false // test add
     this ._tabIndex  =   - 1 ;
    
this ._dynamicContextKey  =   null ;
    
this ._dynamicServicePath  =   null ;
    
this ._dynamicServiceMethod  =   null ;
    
this ._dynamicPopulateBehavior  =   null ;
    
this ._scrollBars  =  AjaxControlToolkit.ScrollBars.None;
    
this ._header_onclick$delegate  =  Function.createDelegate( this this ._header_onclick);
    
this ._header_onmouseover$delegate  =  Function.createDelegate( this this ._header_onmouseover);
    
this ._header_onmouseout$delegate  =  Function.createDelegate( this this ._header_onmouseout);
    
this ._header_onmousedown$delegate  =  Function.createDelegate( this this ._header_onmousedown);
    
this ._dynamicPopulate_onpopulated$delegate  =  Function.createDelegate( this this ._dynamicPopulate_onpopulated);
    
this ._oncancel$delegate  =  Function.createDelegate( this this ._oncancel);
}
复制代码

 

接下来,我们还需要在AjaxControlToolkit.TabPanel.prototype 中添加_disabled属性的访问器:

 

复制代码
    get_disabled:  function () {
        
return   this ._disabled;
    },

    set_disabled: 
function (value) {
        
if  (value  !=   this ._disabled) {
            
this ._disabled  =  value;

            
if  ( this .get_isInitialized()) {
                
if  ( ! this ._disabled) {
                    
this                 }  else  {
                    
this                 }
            }
            
this .raisePropertyChanged( " disabled " );
        }
    },
复制代码

 

有了get和set访问器,我们就可以在客户端使用

$find( ' <%=Tabs.ClientID%> ' ).get_tabs()[ 2 ].set_disabled( true );

 

来设置该属性

 

3. 添加客户端行为

有了属性,我们接下来定义属性所代表的行为,在这里,我们使用_regular()和_grayout()两个方法来进行TabPanel的“恢复启用”和“变灰禁用”的状态设置:

复制代码
    _regular:  function () {
        
this ._tab.disabled  =   false ;
    },

    _grayout: 
function () {
        
this ._tab.disabled  =   true ;
        
this .get_headerTab().disabled  =   true ;
        
if  ( this ._get_active()) {

            
var  next  =   this ._owner.getNearestTab( false );
            
if  ( !! next) {
                
this ._owner.set_activeTab(next);
            }
        }
        
this ._deactivate();
    }
复制代码

 

这两个方法由上面代码中高亮的部分调用。

4. 编译测试

修改工作完成后,我们重新编译AjaxControlToolkit.dll,并覆盖项目中原有的引用,即可在网站中使用扩展后的控件:

 

复制代码
<% @ Page Language = " C# "   %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< script  runat ="server" >


    protected 
void  Button1_Click(object sender, EventArgs e)
    {
        
this .TabPanel2.Disabled  =   true ;
    }
    
</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title ></ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
        
< ajaxToolkit:ToolkitScriptManager  ID ="ToolkitScriptManager1"  runat ="server" >
        
</ ajaxToolkit:ToolkitScriptManager >
        
< ajaxToolkit:TabContainer  ID ="Tabs"  runat ="server"  Width ="100%"  ActiveTabIndex ="0" >
            
< ajaxToolkit:TabPanel  runat ="server"  ID ="TabPanel1"  HeaderText ="11111" >
                
< ContentTemplate >
                    grid view
                
</ ContentTemplate >
            
</ ajaxToolkit:TabPanel >
            
< ajaxToolkit:TabPanel  runat ="server"  ID ="TabPanel2"  HeaderText ="22222" >
                
< ContentTemplate >
                    
                
</ ContentTemplate >
            
</ ajaxToolkit:TabPanel >
            
< ajaxToolkit:TabPanel  runat ="server"  ID ="TabPanel3"  HeaderText ="33333" >
                
< ContentTemplate >
                    
                
</ ContentTemplate >
            
</ ajaxToolkit:TabPanel >
            
< ajaxToolkit:TabPanel  runat ="server"  ID ="TabPanel4"  HeaderText ="44444" >
                
< ContentTemplate >
                    
                
</ ContentTemplate >
            
</ ajaxToolkit:TabPanel >
        
</ ajaxToolkit:TabContainer >
    
</ div >

    
< script  type ="text/javascript" >

        
function  pageLoad() {
            $find(
' <%=Tabs.ClientID%> ' ).get_tabs()[ 2 ].set_disabled( true );
        }
    
    
</ script >

    
< asp:Button  ID ="Button1"  runat ="server"  onclick ="Button1_Click"  Text ="Button"   />

    
</ form >
</ body >
</ html >
复制代码

 

效果如下图所示,TabPanel被真正的Disable了:

 

 

全部代码请访问如下链接获取:http://forums.asp.net/p/1388315/2964536.aspx#2964536

 Thanks

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值