GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]
/*正式版的实现 开始*/
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;
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";
}
}
}
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;
}
}
[索引页]
[源码下载]
扩展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#


































































































































介绍
平时使用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
{
}







2、新建一个FixRowCol类,有七个属性





































































































3、在继承自GridView的类中加一个复杂对象属性,该复杂对象就是第2步创建的那个FixRowCol






















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