(一). 概述
1. 当鼠标悬浮到控件对象上, 会弹出此自定义控件.
2. 具有通用性, 只要支持 onmouseenter/onmouseleave 等几个事件方法的目标控件都可以使用此控件.
3. 此控件与前面自定义控件[右击弹出菜单]控件有些类似, 区别是这个控件客户端JavaScript部分有些麻烦.
(二). 运行如图
(三). 用法
1. 将FloatTraceMenu控件Dll添加引用到Web站点工程中
2. 从工具箱拖动一个FloatTraceMenu控件和另一个支持onmouseenter/onmouseleave 等事件
的控件到设计器中, 比如: 1 ///
2 /// Author: [ ChengKing(ZhengJian) ] 3 /// Blog: Http://blog.csdn.net/ChengKing 4 /// Date: 2007/4/3 5 /// 6 [DefaultProperty( " TargetControl " )] 7 [ToolboxData( " <{0}:FloatTraceMenu runat=server> " )] 8 // [Designer(typeof(System.ComponentModel.Design.DesignerCollection))] 9 public class FloatTraceMenu : Control, IComponent 10 { 11 12 [Bindable( true )] 13 [Category( " Appearance " )] 14 [DefaultValue( " [FloatTraceMenu / " FloatTraceMenu1/ " ] " )] 15 [Localizable( true )] 16 public string Text 17 { 18 get 19 { 20 String s = (String)ViewState[ " Text " ]; 21 return ((s == null ) ? String.Empty : s); 22 } 23 24 set 25 { 26 ViewState[ " Text " ] = value; 27 } 28 } 29 30 [Bindable( true )] 31 [Category( " Appearance " )] 32 [DefaultValue( "" )] 33 [Description( " 设置此控件的寄主控件 " )] 34 [TypeConverter( typeof (ControlIDConverter))] 35 public string TargetControl 36 { 37 get 38 { 39 String s = (String)ViewState[ " TargetControl " ]; 40 return ((s == null ) ? String.Empty : s); 41 } 42 set 43 { 44 ViewState[ " TargetControl " ] = value; 45 } 46 } 47 48 protected override void Render(HtmlTextWriter writer) 49 { 50 if (DesignMode) 51 { 52 this .Controls.Clear(); 53 LiteralControl lc = new LiteralControl(); 54 lc.Text = this .Text; 55 this .Controls.Add(lc); 56 } 57 base .Render(writer); 58 } 59 60 protected override void CreateChildControls() 61 { 62 base .CreateChildControls(); 63 } 64 65 protected override void OnPreRender(EventArgs e) 66 { 67 68 if ( ! Page.ClientScript.IsClientScriptBlockRegistered( " BuildMenu " )) 69 { 70 Page.ClientScript.RegisterClientScriptBlock( this .GetType(), " BuildMenu " , 71 " <script type='text/javascript' src='JScript.js'></script> " ); 72 } 73 74 // GridView增加FloatMenu 75 Control targetControl = this .FindControl(TargetControl); 76 77 // 给GridView头增加FloatMenu 78 // Control targetControl = this.FindControl(TargetControl).Controls[0].Controls[0]; 79 80 StringBuilder strInitScript = new StringBuilder(); 81 if (targetControl != null ) 82 { 83 strInitScript.Append( " <script text/javascript> " ); 84 strInitScript.Append( " writeStyle(); makeMenu(); var obj; " ); 85 strInitScript.Append( " if( document.all&&window.print ) " ); 86 strInitScript.Append( " { " ); 87 strInitScript.Append( " var objClientId = ' " + targetControl.ClientID + " '; " ); 88 strInitScript.Append( " if(objClientId != null) " ); 89 strInitScript.Append( " { " ); 90 strInitScript.Append( " obj = document.getElementById(objClientId); " ); 91 strInitScript.Append( " document.onclick = forcehideMenu; " ); 92 // strInitScript.Append(" obj.onmouseover = showMenu;"); 93 strInitScript.Append( " obj.onmouseenter = showMenu; " ); 94 // strInitScript.Append(" obj.onmouseout = hideMenu;"); 95 strInitScript.Append( " obj.onmouseleave = hideMenu; " ); 96 strInitScript.Append( " obj.onmousemove = moveMenu; " ); 97 strInitScript.Append( " obj.oncontextmenu = showMenu; " ); 98 strInitScript.Append( " } " ); 99 strInitScript.Append( " else {alert('Please Set TargetControl Property!')} " ); 100 strInitScript.Append( " } " ); 101 strInitScript.Append( " </script> " ); 102 } 103 else 104 { 105 strInitScript.Append( " <script text/javascript> " ); 106 strInitScript.Append( " alert('Please Set TargetControl Property!'); " ); 107 strInitScript.Append( " </script> " ); 108 } 109 if ( ! Page.ClientScript.IsStartupScriptRegistered( " InitScript " )) 110 { 111 Page.ClientScript.RegisterStartupScript( this .GetType(), " InitScript " , 112 strInitScript.ToString()); 113 } 114 115 base .OnPreRender(e); 116 } 117 } 2. 测试页面文件default.aspx代码
(五). 示例代码下载
(六). 控件开发其它相关文章: