posted on August 29, 2007

本人的博客性别鉴定




博客园-武眉博<.








93.0%男性倾向,7.0%女性倾向



评点:您的文风冷静而镇定,言语间展现出强悍的思辨能力与恢宏的胸襟,一个男子汉的阳刚形象跃然纸上。
yodao | 博客男女

posted on August 5, 2007

自定义控件实现广告内容后期加载,以及NamingContainer层次的应用

自定义控件:广告内容后期加载。以及NamingContainer层次的应用
网站上的广告内容可能会因加载过慢而导致整个网页加载过慢
我们可以考虑将广告内全部放在网页最底部,等整个页面加载完毕後
再采用javascript使其显示,考虑给控件一个TargetContainerID标识
控件广告内容将要被显示的容器ID,然后从控件自己所处的 开始向上查找该ID
所指定的控件,(我们只向上找而没有向下找,并且没有处理某层次的
子NamingContainer,所以不一定能够找到,这里没有考虑从Page对象向下递归查找
主要考虑为了提高性能),如果没有找到,则考虑给用户一个事件让用户自己处理TargetContainer



下面的自定义控件对此实现了封装:

//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.AspxBoy.com"><br />// Copyright (c) www.AspxBoy.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />namespace HBZ.Ads.Controls<br />{<br />using System;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using HBZ.Ads;<br />using System.Collections.Generic;<br />using System.Text;<br />[Designer( typeof( HBZ.Ads.Controls.AdRotatorDesigner ) )]<br />public class AdRotator : WebControl<br />{<br />private Dictionary<string , Control> findControlHelperCacheList = new Dictionary<string , Control>( );<br />private readonly string scriptFormat = " var {0}_target = document.getElementById(\"{0}\"); var {1}_base = document.getElementById(\"{1}\"); if ({0}_target) {{ {0}_target.innerHTML = {1}_base.innerHTML; {1}_base.innerHTML = \"\"; }}";<br />private static readonly object eventObj = new object( );<br />public event FindTargetContainerEventHandler FindTargetContainer<br />{<br />add<br />{<br />Events.AddHandler( eventObj , value );<br />}<br />remove<br />{<br />Events.RemoveHandler( eventObj , value );<br />}<br />}<br />public AdRotator( )<br />: base( HtmlTextWriterTag.Span )<br />{<br />}<br />[TypeConverter( typeof( ValidatedControlConverter ) )]<br />[DefaultValue( "" ) , Category( "Data" ) , Description( "广告位后期加载后显示的位置的控件ID" )]<br />[IDReferenceProperty]<br />public string TargetContainerID<br />{<br />get<br />{<br />return (string)this.ViewState[ "TargetContainerID" ] ?? string.Empty;<br />}<br />set<br />{<br />this.ViewState[ "TargetContainerID" ] = value;<br />}<br />}<br />[Bindable( true ) , Category( "Data" ) , DefaultValue( "" ) , Description( "广告位的默认内容" )]<br />public string DefaultContent<br />{<br />get<br />{<br />return (string)this.ViewState[ "DefaultContent" ] ?? "广告位招租";<br />}<br />set<br />{<br />this.ViewState[ "DefaultContent" ] = value;<br />}<br />}<br />protected override void OnPreRender( EventArgs e )<br />{<br />base.OnPreRender( e );<br />if ( !string.IsNullOrEmpty( TargetContainerID ) )<br />{<br />this.Style.Add( HtmlTextWriterStyle.Display , "none" );<br />ClientScriptManager cs = Page.ClientScript;<br />if ( !cs.IsStartupScriptRegistered( this.ClientID ) )<br />{<br />cs.RegisterStartupScript( this.GetType( ) , this.ClientID , GetLazyLoadingScript( ) , true );<br />}<br />}<br />}<br />protected virtual string GetLazyLoadingScript( )<br />{<br />Control target = FindControlHelper( TargetContainerID );<br />if ( target == null )<br />{<br />throw new TargetContainerNotFoundException( );<br />}<br />StringBuilder sb = new StringBuilder( );<br />sb.AppendFormat( scriptFormat , target.ClientID , this.ClientID );<br />return sb.ToString( );<br />}<br />protected virtual void RenderAdvertisement( Advertisement ad , HtmlTextWriter writer )<br />{<br />// 广告内容<br />}<br />protected override void RenderContents( HtmlTextWriter writer )<br />{<br />// call RenderAdvertisement method<br />}<br />protected Control FindControlHelper( string id )<br />{<br />Control c = null;<br />if ( findControlHelperCacheList.ContainsKey( id ) )<br />{<br />c = findControlHelperCacheList[ id ];<br />}<br />else<br />{<br />c = base.FindControl( id ); // 注意:我们从自己开始向上沿NamingContainer层次查找<br />Control nc = NamingContainer;<br />while ( ( null == c ) && ( null != nc ) )<br />{<br />c = nc.FindControl( id );<br />nc = nc.NamingContainer;<br />}<br />if ( null == c )<br />{<br />// 因为我们是从自己开始向上沿NamingContainer层次查找,而没有向下找,<br />// 并且没有找每一层NamingContainer内的其他NamingContainer,<br />// 所以这种查找有可能出现没有找到id对应的控件<br />// 当没此时有找到时,激发FindTargetContainer事件交给用户自己设定Target Container Control<br />FindTargetContainerEventArgs args = new FindTargetContainerEventArgs( id );<br />OnFindTargetContainer( args );<br />c = args.Control;<br />}<br />if ( null != c )<br />{<br />findControlHelperCacheList[ id ] = c;<br />}<br />}<br />return c;<br />}<br />protected virtual void OnFindTargetContainer( FindTargetContainerEventArgs e )<br />{<br />FindTargetContainerEventHandler hander = Events[ eventObj ] as FindTargetContainerEventHandler;<br />if ( hander != null )<br />{<br />hander( this , e );<br />}<br />}<br />}<br />public delegate void FindTargetContainerEventHandler( object src , FindTargetContainerEventArgs e );<br />public class FindTargetContainerEventArgs : EventArgs<br />{<br />private string controlID;<br />private Control control;<br />public FindTargetContainerEventArgs( string controlId )<br />{<br />controlID = controlId;<br />}<br />public string ControlID<br />{<br />get<br />{<br />return controlID;<br />}<br />}<br />public Control Control<br />{<br />get<br />{<br />return control;<br />}<br />set<br />{<br />control = value;<br />}<br />}<br />}<br />public class TargetContainerNotFoundException : Exception<br />{<br />string exceptionMessage = string.Empty;<br />public TargetContainerNotFoundException( )<br />: this( "TargetContainerID所指定的控件没有找到!您或许应该处理一下FindTargetContainer事件" )<br />{<br />}<br />public TargetContainerNotFoundException( string message )<br />: base( message )<br />{<br />this.exceptionMessage = message;<br />}<br />public override string Message<br />{<br />get<br />{<br />if ( exceptionMessage != null )<br />{<br />return exceptionMessage;<br />}<br />return base.Message;<br />}<br />}<br />}<br />}<br />

posted on August 1, 2007

奇怪的下载进度显示

今天下载VS2008 beta 发现一个奇怪的下载提示 百分之好几百