扩展GridView控件(5) - 固定指定行、指定列

简介:
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(5) - 固定指定行、指定列


作者: webabcd
 
/*正式版的实现 开始*/
 
介绍
扩展GridView控件:
固定指定行、指定列,根据RowType固定行,根据RowState固定行

使用方法(设置FixRowColumn复合属性): 
FixRowType - 需要固定的行的RowType(用逗号“,”分隔)
FixRowState - 需要固定的行的RowState(用逗号“,”分隔)
FixRows - 需要固定的行的索引(用逗号“,”分隔)
FixColumns - 需要固定的列的索引(用逗号“,”分隔)
TableWidth - 表格的宽度
TableHeight - 表格的高度


关键代码
css
/*固定行*/ 
.yy_sgv_fixRow 
{  
        position
:  relative;  top:  expression(this.offsetParent.scrollTop - 1)
}  
/*固定列*/ 
.yy_sgv_fixCol 
{  
        position
:  relative;  left:  expression(this.offsetParent.scrollLeft - 1)
}  
/*高优先级的固定*/ 
.yy_sgv_fixHigh 
{  
        z-index
:  9999
}  
/*低优先级的固定*/ 
.yy_sgv_fixLow 
{  
        z-index
:  1000
}
 
c#
using System; 
using System.Collections.Generic; 
using System.Text; 
 
using System.Web.UI.WebControls; 
using System.Web.UI; 
 
namespace YYControls.SmartGridViewFunction 

         /// <summary> 
         /// 扩展功能:固定指定行、指定列 
         /// </summary> 
         public  class FixRowColumnFunction : ExtendFunction 
        { 
                 /// <summary> 
                 /// 构造函数 
                 /// </summary> 
                 public FixRowColumnFunction() 
                        :  base() 
                { 
 
                } 
 
                 /// <summary> 
                 /// 构造函数 
                 /// </summary> 
                 /// <param name="sgv">SmartGridView对象</param> 
                 public FixRowColumnFunction(SmartGridView sgv) 
                        :  base(sgv) 
                { 
 
                } 
 
                 /// <summary> 
                 /// 扩展功能的实现 
                 /// </summary> 
                 protected  override  void Execute() 
                { 
                         this._sgv.RowDataBoundCell +=  new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell); 
                         this._sgv.RenderBegin +=  new SmartGridView.RenderBeginHandler(_sgv_RenderBegin); 
                         this._sgv.RenderEnd +=  new SmartGridView.RenderEndHandler(_sgv_RenderEnd); 
                } 
 
                 /// <summary> 
                 /// SmartGridView的RowDataBoundCell事件 
                 /// </summary> 
                 /// <param name="sender"></param> 
                 /// <param name="gvtc"></param> 
                 void _sgv_RowDataBoundCell( object sender, GridViewTableCell gvtc) 
                { 
                        TableCell tc = gvtc.TableCell; 
                        GridViewRow gvr = (GridViewRow)tc.Parent; 
 
                         int i = 0;  // 0-既不固定行也不固定列;1-固定行或固定列;2-既固定行也固定列 
                         // 固定行 
                         if    
                        ( 
                                ( 
                                        !String.IsNullOrEmpty( this._sgv.FixRowColumn.FixRows)    
                                        &&    
                                        Array.Exists( this._sgv.FixRowColumn.FixRows.Split(','),  delegate( string s) {  return s == gvr.RowIndex.ToString(); }) 
                                ) 
                                ||    
                                ( 
                                        !String.IsNullOrEmpty( this._sgv.FixRowColumn.FixRowType)    
                                        &&    
                                        Array.Exists( this._sgv.FixRowColumn.FixRowType.Split(','),  delegate( string s) {  return s == gvr.RowType.ToString(); }) 
                                ) 
                                ||    
                                ( 
                                        !String.IsNullOrEmpty( this._sgv.FixRowColumn.FixRowState)    
                                        &&    
                                        Array.Exists( this._sgv.FixRowColumn.FixRowState.Split(','),  delegate( string s) {  return s == gvr.RowState.ToString(); }) 
                                ) 
                        ) 
                        { 
                                i++; 
                                Helper.Common.SetAttribute(tc,  "class""yy_sgv_fixRow", AttributeValuePosition.Last, ' '); 
                        } 
                         // 固定列 
                         if    
                                ( 
                                        !String.IsNullOrEmpty( this._sgv.FixRowColumn.FixColumns) 
                                        && 
                                        Array.Exists( this._sgv.FixRowColumn.FixColumns.Split(','),  delegate( string s) {  return s == gvtc.ColumnIndex.ToString(); }) 
                                ) 
                        { 
                                i++; 
                                Helper.Common.SetAttribute(tc,  "class""yy_sgv_fixCol", AttributeValuePosition.Last, ' '); 
                        } 
 
                         // 低等级的z-index 
                         if (i == 1) 
                        { 
                                Helper.Common.SetAttribute(tc,  "class""yy_sgv_fixLow", AttributeValuePosition.Last, ' '); 
                        } 
                         // 高等级的z-index 
                         else  if (i == 2) 
                        { 
                                Helper.Common.SetAttribute(tc,  "class""yy_sgv_fixHigh", AttributeValuePosition.Last, ' '); 
                        } 
                } 
 
                 /// <summary> 
                 /// RenderBegin 
                 /// </summary> 
                 /// <param name="sender"></param> 
                 /// <param name="writer"></param> 
                 void _sgv_RenderBegin( object sender, HtmlTextWriter writer) 
                { 
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Overflow,  "auto"); 
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Position,  "relative"); 
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Width, String.IsNullOrEmpty( this._sgv.FixRowColumn.TableWidth) ?  "100%" :  this._sgv.FixRowColumn.TableWidth); 
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Height, String.IsNullOrEmpty( this._sgv.FixRowColumn.TableHeight) ?  "100%" :  this._sgv.FixRowColumn.TableHeight); 
                        writer.RenderBeginTag(HtmlTextWriterTag.Div); 
                } 
 
                 /// <summary> 
                 /// RenderEnd 
                 /// </summary> 
                 /// <param name="sender"></param> 
                 /// <param name="writer"></param> 
                 void _sgv_RenderEnd( object sender, HtmlTextWriter writer) 
                { 
                        writer.RenderEndTag(); 
                } 
        } 
}
 
/*正式版的实现 结束*/
 
/*测试版的实现 开始*/
 
介绍
平时使用GridView的时候会有固定表头、指定行或指定列的需求,就像Excel冻结行、列那样。其实我们可以用CSS来搞定。扩展一下GridView,通过设置几个属性来达到这样的功能。


控件开发
1、新建一个继承自GridView的类,另外为了保持滚动条状态,还要继承IPostBackDataHandler接口
/// <summary> 
         /// 继承自GridView 
         /// </summary> 
        [ToolboxData( @"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")] 
         public  class SmartGridView : GridView, IPostBackDataHandler 
        { 
 
        }
 
2、新建一个FixRowCol类,有七个属性
using System; 
using System.Collections.Generic; 
using System.Text; 
 
using System.ComponentModel; 
 
namespace YYControls.SmartGridView 

         /// <summary> 
         /// 固定表头、指定行或指定列的实体类 
         /// </summary> 
        [TypeConverter( typeof(ExpandableObjectConverter))] 
         public  class FixRowCol 
        { 
                 private  bool _isFixHeader; 
                 /// <summary> 
                 /// 固定表头否? 
                 /// </summary> 
                [Description( "固定表头否?"), Category( "扩展"), DefaultValue( false), NotifyParentProperty( true)] 
                 public  virtual  bool IsFixHeader 
                { 
                        get {  return _isFixHeader; } 
                        set { _isFixHeader = value; } 
                } 
 
                 private  bool _isFixPager; 
                 /// <summary> 
                 /// 固定分页行否? 
                 /// </summary> 
                [Description( "固定分页行否?"), Category( "扩展"), DefaultValue( false), NotifyParentProperty( true)] 
                 public  virtual  bool IsFixPager 
                { 
                        get {  return _isFixPager; } 
                        set { _isFixPager = value; } 
                } 
 
                 private  string _fixRowIndices; 
                 /// <summary> 
                 /// 需要固定的行的索引(用逗号“,”分隔) 
                 /// </summary> 
                [Description( "需要固定的行的索引(用逗号“,”分隔)"), Category( "扩展"), NotifyParentProperty( true)] 
                 public  virtual  string FixRowIndices 
                { 
                        get {  return _fixRowIndices; } 
                        set { _fixRowIndices = value; } 
                } 
 
                 private  string _fixColumnIndices; 
                 /// <summary> 
                 /// 需要固定的列的索引(用逗号“,”分隔) 
                 /// </summary> 
                [Description( "需要固定的列的索引(用逗号“,”分隔)"), Category( "扩展"), NotifyParentProperty( true)] 
                 public  virtual  string FixColumnIndices 
                { 
                        get {  return _fixColumnIndices; } 
                        set { _fixColumnIndices = value; } 
                } 
 
                 private System.Web.UI.WebControls.Unit _tableWidth; 
                 /// <summary> 
                 /// 表格的宽度 
                 /// </summary> 
                [Description( "表格的宽度"), Category( "扩展"), NotifyParentProperty( true)] 
                 public System.Web.UI.WebControls.Unit TableWidth 
                { 
                        get {  return _tableWidth; } 
                        set { _tableWidth = value; } 
                } 
 
                 private System.Web.UI.WebControls.Unit _tableHeight; 
                 /// <summary> 
                 /// 表格的高度 
                 /// </summary> 
                [Description( "表格的高度"), Category( "扩展"), NotifyParentProperty( true)] 
                 public System.Web.UI.WebControls.Unit TableHeight 
                { 
                        get {  return _tableHeight; } 
                        set { _tableHeight = value; } 
                } 
 
                 private  bool _enableScrollState; 
                 /// <summary> 
                 /// 是否保持滚动条的状态 
                 /// </summary> 
                [Description( "是否保持滚动条的状态"), Category( "扩展"), DefaultValue( false), NotifyParentProperty( true)] 
                 public  bool EnableScrollState 
                { 
                        get {  return _enableScrollState; } 
                        set { _enableScrollState = value; } 
                } 
 
                 /// <summary> 
                 /// ToString(); 
                 /// </summary> 
                 /// <returns></returns> 
                 public  override  string ToString() 
                { 
                         return  "FixRowCol"
                } 
        } 
}
 
3、在继承自GridView的类中加一个复杂对象属性,该复杂对象就是第2步创建的那个FixRowCol
private FixRowCol _fixRowCol; 
                 /// <summary> 
                 /// 固定表头、指定行或指定列 
                 /// </summary> 
                [ 
                Description( "固定表头、指定行或指定列"), 
                Category( "扩展"), 
                DefaultValue(""), 
                DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
                PersistenceMode(PersistenceMode.InnerProperty) 
                ] 
                 public  virtual FixRowCol FixRowCol 
                { 
                        get 
                        { 
                                 if (_fixRowCol ==  null
                                { 
                                        _fixRowCol =  new FixRowCol(); 
                                } 
                                 return _fixRowCol; 
                        } 
                }
 
 




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


相关文章
PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
713 0
|
4月前
|
开发框架 前端开发 JavaScript
在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件
在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件
gridControl在同一列的不同行创建不同的控件(已CheckEidt搭配ButtonEdit为例)
gridControl在同一列的不同行创建不同的控件(已CheckEidt搭配ButtonEdit为例)
|
人工智能 C#
c#中在datagridview的表格动态增加一个按钮方法
c#中在datagridview的表格动态增加一个按钮方法,如果想要这一套教程的可以移步去这里 《期末作业C#实现学生宿舍管理系统》,对了最近我们有一个人工智能交流群,如果大家对代码有问题,想交流的可以进群,私聊我就可以了! 效果图片 : 在Load事件中写入代码 那ui有了功能怎么办呢?别急我们在 dataGridView1_CellContentClick事件中添加方法 这样的话 我们就可以点击对应行的修改来获取到id的值这里有一个bug就是第三行没数据需要隐藏,现在还没有解决,欢迎大家指出!.....
682 0
c#中在datagridview的表格动态增加一个按钮方法
ElementUI el-table 设置固定列,横向滚动条在固定列的位置上无法滚动的问题
ElementUI el-table 设置固定列,横向滚动条在固定列的位置上无法滚动的问题
1929 0