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

简介:
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,如需转载请自行联系原作者



相关文章
|
20天前
如何实现更改窗体标题栏的样式
如何实现更改窗体标题栏的样式
18 0
|
5月前
|
索引
[Qt5&控件] 下拉框ComBoBox和层叠窗口StackedWidget控件组合使用
[Qt5&控件] 下拉框ComBoBox和层叠窗口StackedWidget控件组合使用
43 0
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6850 0
|
C#
WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAuto...
2320 0
|
C#
WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问
原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem var cm = mi.
942 0