ASP.NET控件利用Control.ContextMenu加入快捷菜单

ContextMenu Control 快捷菜单控件概述:

MSDN Liabrary 中包含了几个DHTML快捷菜单的示例。分别提供了对这一功能的不能实现方法。一个快捷菜单就是在页面中任何位置的一组标记代码。它包括两部分内容——界面和脚本(当用户在页面右击时关联UI),UI提供一个可点击的元素的列表——菜单项——和各自的内容文本,图标,命令名(command name),目标url,提示(tooltip),和所有你认为有必要显示出来的东西。快捷菜单界面是页面的一部分,并且属于页面控件树中的一员。(太多的快捷菜单将会出现执行的问题:与大多数用户的常规情况相比,ASP.NET将发送更多的快捷菜单到浏览器)当用户在页面的一个元素上右击时,将引发一段 JavaScript,这段脚本将快捷菜单移动到右击的位置显示。

快捷菜单将保持隐藏属性,只有当用户在页面的一个绑定个快捷菜单的元素上右击时,快捷菜单才显示。页面元素接收脚本事件并弹出一个快捷菜单作为响应。脚本事件信赖于浏览器,在Internet Explorer 5.0和更新版本中是 OnContexMenu事件.在Netscape6.0和更新版本中你要使用 OnMouseUp 事件(在Internet Explorer 5.0+中你也可能使用OnMouseUp事件,但要多写几行代码)在接收事件的脚本中,获取快捷菜单的UI代码块并且将它移动到发生点击的位置。同时设置弹出的panel的 visibilty属性。当用户在菜单项上点击时,页面回传并引发服务器端事件。对于服务器而言,点击一个菜单项和点击一具常规的按钮没什么区别。

当用户户想取消已经打开的快捷菜单时怎么办呢?在windows程序中,按下Esc键或者在菜单区域外点击都可以取消已弹出的快捷菜单。所以你必须在Web中实现这一功能。请注意,只有快捷菜单处于活动(显示出来)时,Esc键才有郊。因为Esc还可用于其它元素的其它键盘快捷方式。

我还可以让菜单在用户鼠标移开菜单时隐藏。可以通过脚本操作 OnMouseLeave 事件实现。

使用弹出菜单控件

假定我们已以设计出了这个弹出菜单(我们一会儿再说如何实现这个快捷菜单控件),那么如何使用它在ASP.NET页面中添加一个或多个快捷菜单呢?首先,在Visual Studio .NET的工个栏中拖一个或多个快捷菜单控件到页面上。然后,为每个菜单添加菜单项,并配置每个菜单项的的工具提示,命令名(command name)和其它所需的内容,例如快捷键和帮助主题的链接。命令名(command name)用于在响应点击快捷菜单发生页面回传时确定是哪一个菜单项被点击;对每一个快捷菜单控件实例的菜单项集合它必须是唯一的。

你必须在HTML标签的OnContextMenu事件中加入代码来弹出快捷菜单,代码必须信赖一系列的参数,象点击的x,y坐标,点击的元素,和要使用的快捷菜单的实例等。注意:如果必要你可以使用这种方式完全代替浏览器的快捷菜单。绑定到OnContextMenu事件执行的JavaScript代码是在运行时动态生成的。ContextMenu控件将暴露一个集合属性来包含分绑定快捷菜单的控件集合,在ContextMenu控件将在运行时给这些要绑定的控件一个 oncontextmenu 属性。OK!完成!可以测试了。

让我们先来想一下ContexMenu控件和页中任意的显示快捷菜单的元素的绑定机制,这种机制对设计时的支持怎么样?理想的情况是:根据基类每一个 Web控件直接暴露一个 ContextMenuId属性。然后在属性窗口中选择这个属性时,将看到在页面中的ContextMenu控件的列表。当然这些ContextMenu 控件我们是已经创建了的;ContextMenuId属性在ASP.NET 1.x中不支持,在将来的ASP.NET2.0中也不支持。

在Visual Studio .NET 2003 集成开发环境中,ASP.NET复合控件可以很好的完成这一工作。可以通过使用类撰写组合现有控件来创作新控件。复合控件可呈现一个重新使用现有控件功能的用户界面。复合控件可以从子控件的属性合成属性并处理由子控件引发的事件。它还可以公开自定义属性和事件。

我不选择使用复合控件有以下几个原因:一个是Visual Studio .NET 2003对于Web窗体中的控件功能的扩展支持的不好(请参见:Extender provider components in ASP.NET: an IExtenderProvider implementation),第二,在Visual Studio 2005的ASP.NET设计器中不再支持组件托盘区。Web窗体设计器现在仅支持ASP.NET控件而忽略象复合控件这样的非可视化的组件。 Visual Studio 2005将不再信赖InitializeComponent节,并且不再在代码文件中自动添任何工具生成(tool-generated)的代码。 ASP.NET控件也不设计成具有快捷菜单,所以要绑定快捷菜单只能通过快捷菜单控件自身的执行。这里我使用类似ASP.NET验证控件和被验证控件之间关联的形式。

时间: 2024-10-24 22:32:56

ASP.NET控件利用Control.ContextMenu加入快捷菜单的相关文章

使用Control Adapters优化Asp.net控件

asp.net|控件|优化 有些时候Asp.net 控件默认状态下生成的html代码,不能满足一些特定的需要.比如 我们想让用户做一些选择,可以很容易的用如下代码实现 <asp:CheckBoxList runat="server">   <asp:ListItem Text="One" />   <asp:ListItem Text="Two" />   <asp:ListItem Text="

为ASP.NET控件加入快捷菜单(1)

asp.net|菜单|控件 为ASP.NET控件加入快捷菜单(1)           虽然快捷菜单在桌面应用程序中已经是非常通用的元素,但是由于在象ASP.NET这样的基于服务器的技术没有很好的描绘,所以在Web应用程序中快捷菜单并不是很通用.要想使用快捷菜单,浏览器必须高度支持DHTML和丰富事件模式,例如:Microsoft Internet Explorer 5.0及更高版本,或者Netscape 6.0等.然而,各种浏览器的对象模式虽然功能上大至相同,但是成员各名字却各不相同,这就需要

为ASP.NET控件添加设计时支持

asp.net|控件|设计 简介 Microsoft ASP.NET 为开发人员提供了一种适用于 Web 开发的.功能最为强大的新工具:服务器控件.服务器控件使开发人员能够在短时间内开发出响应速度快而且功能强大的 Web 应用程序,所需的时间与在典型的 ASP 中创建类似应用程序的时间差不多. ASP.NET 服务器控件之所以能够提供生产效率,关键原因之一在于它为 Microsoft Visual Studio .NET 开发环境中的服务器控件提供了丰富的设计时支持.开发人员可以将服务器控件从

一起谈.NET技术,asp.net控件开发基础(15)

继续我们的话题吧.自定义控件.如果你还不熟悉自定义控件开发的话,还请看看我以前写了几篇,希望对你有帮助 1.1何处继承 自定义控件一般从以下几个基类(此处不包含数据控件) 一.Control类(所有服务器控件的基类,算是比较底层的类,如果控件功能比较简单,要求不多,可直接继承此类.) 二.WebControl类(标准控件的基类,继承此类,你可以继承其丰富的公共属性,若标准控件中的控件没有你需要的控件,你可以继承此类) 三.CompositeControl 类(2.0新增的类,此类继承自WebCo

使用ASP.NET控件进行程序设计

asp.net|程序|控件|设计        ASP.NET 控件时ASP.NET架构的基本组成部分.从本质上讲,ASP.NET是.NET    Framework中的类,可以在ASP.NET页面上映射控件声明.然后,那些类根据他们的   属性,为控件创建HTML.由于类的对象是在运行时间与页面一起被编译的,因此开   发人员可以按照面向对象的方式访问那些对象,例如读取和更改他们的属性.调用他   们的方法和处理服务器端的事件等.在传统ASP程序设计中,服务端的VBScript代码   和HT

Cutting Edge:为ASP.NET控件加入快捷菜单(2)

asp.net|菜单|控件 Cutting Edge:为ASP.NET控件加入快捷菜单(2)英文原文:Adding a Context Menu to ASP.NET Controls作者:Dino Esposito翻译:刘瑞才源码:CuttingEdge0502.exe 编程接口 我们的ContextMenu控件从WebControl继承并执行INamingContainer接口 public class ContextMenu : WebControl, INamingContainer 图

asp.net控件加載

asp.net|控件 1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30% runat=server id=ContainerLeft>&l

ASP.NET控件开发基础(7)

上一篇写了控件样式的一些基础的东西,接着我们继续讨论asp.net控件开发的一些东西. 这次我们要讨论的是复合控件.本文无法一步到位完整介绍,因为讨论的篇幅比较大,所以分两次写,这次就先讲些基本概念吧,剩着的下次写. 好象复合控件网上已经有很多教程了,相信大家也看过很多.如果看过的朋友就当我再废话一便,没看过的朋友希望能给你带来帮助. 1.复合控件概念 复合控件跟用户控件有很多相似点,最大不同就是用户控件后缀为ascx,而复合控件编译后则为dll文件,还可以分发给大家使用,另外其他不同点还请参考

ASP.NET控件开发基础(4)

一.从继承WebControl开始 在第二篇教程中,重点介绍了Render()方法的使用,用来呈现控件,但从Control类继承的控件尚未发挥asp.net控件的作用.大家知道web服务器控件分为HTML服务器控件(如<input id="Button2" runat="server" type="button" value="button" />这样的形式)和标准服务器控件(就是<asp:.. id=&qu