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

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 11:14   19   0

前言:

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._regular();
} else {
this._grayout();
}
}
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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP