扩展GridView控件(1) - 鼠标经过行时改变行的样式

本文介绍了一个扩展GridView控件的方法,通过继承GridView并添加鼠标悬停样式更改的功能,简化了每次都需要手动编码实现相同效果的过程。
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(1) - 鼠标经过行时改变行的样式


作者: webabcd
InBlock.gif /*正式版的实现 开始*/
介绍
扩展GridView控件:
鼠标经过行的时候改变该行的样式,鼠标离开行的时候恢复该行的样式

使用方法(设置属性):
MouseOverCssClass - 鼠标经过行时行的 CSS 类名


关键代码
InBlock.gif /*鼠标经过行时改变行的样式 开始*/ 
InBlock.gifvar yy_sgv_originalCssClassName = '';  // 初始样式 
InBlock.gif 
InBlock.giffunction yy_sgv_changeMouseOverCssClass(obj, cssClassName) 
InBlock.gif
/// <summary>鼠标经过时改变样式</summary> 
InBlock.gif 
InBlock.gif         if (arguments.length == 1) 
InBlock.gif        { 
InBlock.gif                yy_sgv_changeCssClass(obj, yy_sgv_originalCssClassName); 
InBlock.gif                yy_sgv_originalCssClassName = ''; 
InBlock.gif        } 
InBlock.gif         else 
InBlock.gif        { 
InBlock.gif                yy_sgv_originalCssClassName = obj.className; 
InBlock.gif                yy_sgv_changeCssClass(obj, cssClassName); 
InBlock.gif        } 
InBlock.gif
InBlock.gif /*鼠标经过行时改变行的样式 结束*/
 
 
InBlock.gif /*正式版的实现 结束*/
 
InBlock.gif /*测试版的实现 开始*/
介绍
我们一般是通过在RowDataBound事件里编码的方式实现GridView的鼠标经过行时改变行的样式的功能。但是每次都这样做比较麻烦。所以我们来开发一个继承自GridView的控件,以扩展它的功能。通过设置其CssClassMouseOver属性来实现这样的功能。


控件开发
1、新建一个继承自GridView的类。
InBlock.gif // <summary> 
/// 继承自GridView 
/// </summary> 
InBlock.gif[ToolboxData( @"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")] 
InBlock.gif public  class SmartGridView : GridView 
InBlock.gif
InBlock.gif}
2、加一个属性,用来指定鼠标经过行时,行的css类名
InBlock.gif private  string _cssClassMouseOver; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 鼠标经过的样式 CSS 类名 
InBlock.gif                 /// </summary> 
InBlock.gif                [Browsable( true)] 
InBlock.gif                [Description( "鼠标经过的样式 CSS 类名")] 
InBlock.gif                [DefaultValue("")] 
InBlock.gif                [Category( "扩展")] 
InBlock.gif                 public  virtual  string CssClassMouseOver 
InBlock.gif                { 
InBlock.gif                        get {  return _cssClassMouseOver; } 
InBlock.gif                        set { _cssClassMouseOver = value; } 
InBlock.gif                }
3、重写OnRowDataBound实现鼠标经过行时改变行的样式的功能。主要是给<tr>增加onmouseover事件和onmouseout事件。
/// <summary> 
InBlock.gif                 /// OnRowDataBound 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 protected  override  void OnRowDataBound(GridViewRowEventArgs e) 
InBlock.gif                { 
InBlock.gif                         if (e.Row.RowType == DataControlRowType.DataRow) 
InBlock.gif                        { 
InBlock.gif                                 // _cssClassMouseOver不是空则执行 
InBlock.gif                                 if (! string.IsNullOrEmpty( this._cssClassMouseOver)) 
InBlock.gif                                { 
InBlock.gif                                         // 在<tr>上 
InBlock.gif                                        e.Row.Attributes.Add( "onmouseover""this.className = '" +  this._cssClassMouseOver +  "'"); 
InBlock.gif 
InBlock.gif                                         // 样式的名称(css类名) 
InBlock.gif                                         string cssClassMouseOut = ""; 
InBlock.gif 
InBlock.gif                                         // 根据RowState的不同, 
InBlock.gif                                         switch (e.Row.RowState) 
InBlock.gif                                        { 
InBlock.gif                                                 case DataControlRowState.Alternate: 
InBlock.gif                                                        cssClassMouseOut =  base.AlternatingRowStyle.CssClass; 
InBlock.gif                                                         break
InBlock.gif                                                 case DataControlRowState.Edit: 
InBlock.gif                                                        cssClassMouseOut =  base.EditRowStyle.CssClass; 
InBlock.gif                                                         break
InBlock.gif                                                 case DataControlRowState.Normal: 
InBlock.gif                                                        cssClassMouseOut =  base.RowStyle.CssClass; 
InBlock.gif                                                         break
InBlock.gif                                                 case DataControlRowState.Selected: 
InBlock.gif                                                        cssClassMouseOut =  base.SelectedRowStyle.CssClass; 
InBlock.gif                                                         break
InBlock.gif                                                 default
InBlock.gif                                                        cssClassMouseOut = ""; 
InBlock.gif                                                         break
InBlock.gif                                        } 
InBlock.gif 
InBlock.gif                                         // 增加<tr>的dhtml事件 
InBlock.gif                                        e.Row.Attributes.Add( "onmouseout""this.className = '" + cssClassMouseOut +  "'"); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         base.OnRowDataBound(e); 
InBlock.gif                }
控件使用
添加这个控件到工具箱里,然后拖拽到webform上,设置其CssClassMouseOver属性即可

aspx文件
<yyc:SmartGridView ID="sgvList" runat="server"> 
</yyc:SmartGridView>
css文件
.over    
{  
        background-color 
:  Red
}
skin文件

<yyc:SmartGridView runat="server" CssClassMouseOver="over"> 
</yyc:SmartGridView> 
注:其实最好的实现办法应该如下,但是因为之后我针对GridView扩展的其他功能可能会与此有冲突,所以没这么用。
InBlock.gif  /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public SmartGridView() 
InBlock.gif                { 
InBlock.gif                         this.PreRender +=  new EventHandler(SmartGridView_PreRender); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// PreRender 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender">sender</param> 
InBlock.gif                 /// <param name="e">e</param> 
InBlock.gif                 void SmartGridView_PreRender( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                         if (! string.IsNullOrEmpty( this._cssClassMouseOver)) 
InBlock.gif                        { 
InBlock.gif                                 // 注册一个客户端变量 
InBlock.gif                                 if (!Page.ClientScript.IsClientScriptBlockRegistered( "jsRowClass")) 
InBlock.gif                                { 
InBlock.gif                                        Page.ClientScript.RegisterClientScriptBlock( 
InBlock.gif                                                 this.GetType(), 
InBlock.gif                                                 "jsRowClass"
InBlock.gif                                                 @"<script type=""text/javascript "">var yy_RowClass</script>" 
InBlock.gif                                                ); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// OnRowDataBound 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 protected  override  void OnRowDataBound(GridViewRowEventArgs e) 
InBlock.gif                { 
InBlock.gif 
InBlock.gif                         if (e.Row.RowType == DataControlRowType.DataRow) 
InBlock.gif                        { 
InBlock.gif                                 // _cssClassMouseOver不是空则执行 
InBlock.gif                                 if (! string.IsNullOrEmpty( this._cssClassMouseOver)) 
InBlock.gif                                { 
InBlock.gif                                        e.Row.Attributes.Add( "onmouseover""yy_RowClass=this.className;this.className='"+ _cssClassMouseOver +  "'"); 
InBlock.gif                                        e.Row.Attributes.Add( "onmouseout""this.className=yy_RowClass"); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         base.OnRowDataBound(e); 
InBlock.gif                }
 
 
InBlock.gif /*测试版的实现 结束*/
 


     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345442,如需转载请自行联系原作者



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值