GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]
[索引页]
[源码下载]
扩展GridView控件(5) - 固定指定行、指定列
/*正式版的实现 开始*/
介绍
扩展GridView控件:
固定指定行、指定列,根据RowType固定行,根据RowState固定行
使用方法(设置FixRowColumn复合属性):
FixRowType - 需要固定的行的RowType(用逗号“,”分隔)
FixRowState - 需要固定的行的RowState(用逗号“,”分隔)
FixRows - 需要固定的行的索引(用逗号“,”分隔)
FixColumns - 需要固定的列的索引(用逗号“,”分隔)
TableWidth - 表格的宽度
TableHeight - 表格的高度
关键代码
css
扩展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;
}
.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();
}
}
}
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接口
平时使用GridView的时候会有固定表头、指定行或指定列的需求,就像Excel冻结行、列那样。其实我们可以用CSS来搞定。扩展一下GridView,通过设置几个属性来达到这样的功能。
控件开发
1、新建一个继承自GridView的类,另外为了保持滚动条状态,还要继承IPostBackDataHandler接口
/// <summary>
/// 继承自GridView
/// </summary>
[ToolboxData( @"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")]
public class SmartGridView : GridView, IPostBackDataHandler
{
}
/// 继承自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";
}
}
}
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;
}
}
/// <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,如需转载请自行联系原作者