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

4、重写OnRowDataBound以设置每个单元格的样式,从而实现固定表头、指定行或指定列的功能。
/// <summary>
                 /// OnRowDataBound
                 /// </summary>
                 /// <param name="e"></param>
                 protected override void OnRowDataBound(GridViewRowEventArgs e)
                {
                         if (e.Row.RowType == DataControlRowType.Pager)
                        {
                                 if (FixRowCol.IsFixPager)
                                {
                                         if ( this.PagerSettings.Position == PagerPosition.Top || ( this.PagerSettings.Position == PagerPosition.TopAndBottom && _isTopPager))
                                        {
                                                 // TopPager固定行和列
                                                e.Row.Cells[0].Attributes.Add( "style", "z-index:999; position: relative; top: expression(this.offsetParent.scrollTop); left: expression(this.offsetParent.scrollLeft);");
                                                 // 现在是TopPager,之后就是BottomPager了,所以设置_isTopPager为false
                                                _isTopPager = false;
                                        }
                                         else if ( this.PagerSettings.Position == PagerPosition.TopAndBottom && !_isTopPager)
                                        {
                                                 // BottomPager只固定列
                                                e.Row.Cells[0].Attributes.Add( "style", "z-index:999; position: relative; left: expression(this.offsetParent.scrollLeft);");
                                                 // 现在是BottomPager,之后就是TopPager了,所以设置_isTopPager为true
                                                _isTopPager = true;
                                        }
                                }
                        }

                         if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
                        {
                                 // 给每一个指定固定的列的单元格加上css属性
                                 if (!String.IsNullOrEmpty(FixRowCol.FixColumnIndices))
                                {
                                         // 列索引
                                         foreach ( string s in FixRowCol.FixColumnIndices.Split(','))
                                        {
                                                 int i;
                                                 if (!Int32.TryParse(s, out i))
                                                         throw new ArgumentException( "FixColumnIndices", "含有非整形的字符");
                                                 if (i > e.Row.Cells.Count)
                                                         throw new ArgumentOutOfRangeException( "FixColumnIndices", "溢出");

                                                e.Row.Cells[i].Attributes.Add( "style", "position: relative; left: expression(this.offsetParent.scrollLeft);");
                                        }
                                }

                                 bool isFixRow = false; // 当前行是否固定
                                 if (FixRowCol.IsFixHeader && e.Row.RowType == DataControlRowType.Header)
                                {
                                        isFixRow = true;
                                }

                                 if (!String.IsNullOrEmpty(FixRowCol.FixRowIndices) && e.Row.RowType == DataControlRowType.DataRow)
                                {
                                         // 行索引
                                         foreach ( string s in FixRowCol.FixRowIndices.Split(','))
                                        {
                                                 int i;
                                                 if (!Int32.TryParse(s, out i))
                                                         throw new ArgumentException( "FixRowIndices", "含有非整形的字符");
                                                 if (i > e.Row.Cells.Count)
                                                         throw new ArgumentOutOfRangeException( "FixRowIndices", "溢出");

                                                 if (i == e.Row.RowIndex)
                                                {
                                                        isFixRow = true;
                                                         break;
                                                }
                                        }
                                }

                                 // 固定该行
                                 if (isFixRow)
                                {
                                         // 该行的每一个单元格
                                         for ( int j = 0; j < e.Row.Cells.Count; j++)
                                        {
                                                 // 该单元格不属于固定列
                                                 if (String.IsNullOrEmpty(e.Row.Cells[j].Attributes[ "style"]) || e.Row.Cells[j].Attributes[ "style"].IndexOf( "position: relative;") == -1)
                                                {
                                                        e.Row.Cells[j].Attributes.Add( "style", " position: relative; top: expression(this.offsetParent.scrollTop);");
                                                }
                                                 // 该单元格属于固定列
                                                 else
                                                {
                                                        e.Row.Cells[j].Attributes.Add( "style", e.Row.Cells[j].Attributes[ "style"] + "top: expression(this.offsetParent.scrollTop); z-index: 666;");
                                                }
                                        }
                                }
                        }

                         base.OnRowDataBound(e);
                }

5、增加两个私有变量
     /// <summary>
                 /// 如果固定行、列的话 滚动条的x位置
                 /// </summary>
                 private int _yy_SmartGridView_x;
                 /// <summary>
                 /// 如果固定行、列的话 滚动条的y位置
                 /// </summary>
                 private int _yy_SmartGridView_y;
 
6、重写GridView的OnPreRender方法,用于注册两个HiddenField,以及注册设置GridView的滚动条的位置的javascript代码

/// <summary>
                 /// OnPreRender
                 /// </summary>
                 /// <param name="e"></param>
                 protected override void OnPreRender(EventArgs e)
                {
                         if (FixRowCol.EnableScrollState)
                        {
                                 // 滚动条x位置
                                Page.ClientScript.RegisterHiddenField( "yy_SmartGridView_x", _yy_SmartGridView_x.ToString());
                                 // 滚动条y位置
                                Page.ClientScript.RegisterHiddenField( "yy_SmartGridView_y", _yy_SmartGridView_y.ToString());

                                 // 设置GridView的滚动条的位置
                                Page.ClientScript.RegisterStartupScript(
                                         this.GetType(),
                                         "jsSetScroll", "<script type=\"text/javascript\">document.getElementById('yy_ScrollDiv').scrollLeft=" + _yy_SmartGridView_x + ";document.getElementById('yy_ScrollDiv').scrollTop=" + _yy_SmartGridView_y + ";</script>"
                                        );

                                 // 将控件注册为要求在页回发至服务器时进行回发处理的控件
                                 if (Page != null) Page.RegisterRequiresPostBack( this);
                        }

                         base.OnPreRender(e);
                }
 
7、重写GridView的Render方法,将GridView用一个div包裹起来。
/// <summary>
                 /// Render
                 /// </summary>
                 /// <param name="writer"></param>
                 protected override void Render(HtmlTextWriter writer)
                {
                         // 给GridView一个容器 <div>
                         if (!FixRowCol.TableWidth.IsEmpty || !FixRowCol.TableHeight.IsEmpty)
                        {
                                 if (FixRowCol.TableWidth.IsEmpty) FixRowCol.TableWidth = new Unit(100, UnitType.Percentage);
                                 if (FixRowCol.TableHeight.IsEmpty) FixRowCol.TableHeight = new Unit(100, UnitType.Percentage);

                                writer.Write( "<div id='yy_ScrollDiv' style=\"overflow: auto; width: "
                                        + FixRowCol.TableWidth.ToString() + "; height: "
                                        + FixRowCol.TableHeight.ToString() + "; position: relative;\" ");

                                 // 如果保持滚动条的状态的话,用隐藏字段记录滚动条的位置
                                 if (FixRowCol.EnableScrollState)
                                {
                                        writer.Write( "onscroll=\"document.getElementById('yy_SmartGridView_x').value = this.scrollLeft; document.getElementById('yy_SmartGridView_y').value = this.scrollTop;\">");
                                }
                                 else
                                {
                                        writer.Write( ">");
                                }
                        }

                         base.Render(writer);

                         // </div> 结束
                         if (!FixRowCol.TableWidth.IsEmpty || !FixRowCol.TableHeight.IsEmpty)
                        {
                                writer.Write( "</div>");
                        }
                }
 
8、获取存储了滚条位置信息的HiddenField的值
void IPostBackDataHandler.RaisePostDataChangedEvent()
                {

                }

                 bool IPostBackDataHandler.LoadPostData( string postDataKey, NameValueCollection postCollection)
                {
                         // 获取两个保存了 固定行、列后 的GridView滚动条的位置信息
                        _yy_SmartGridView_x = String.IsNullOrEmpty(postCollection[ "yy_SmartGridView_x"]) ? 0 : Convert.ToInt32(postCollection[ "yy_SmartGridView_x"]);
                        _yy_SmartGridView_y = String.IsNullOrEmpty(postCollection[ "yy_SmartGridView_y"]) ? 0 : Convert.ToInt32(postCollection[ "yy_SmartGridView_y"]);

                         return false;
                }
 
控件使用
添加这个控件到工具箱里,然后拖拽到webform上,设置其FixRowCol下的7个属性即可。IsFixHeader是固定表头否?;IsFixPager是固定分页行否?;FixRowIndices是需要固定的行的索引(用逗号“,”分隔);FixColumnIndices是需要固定的列的索引(用逗号“,”分隔);TableWidth是表格的宽度;TableHeight是表格的高度;EnableScrollState为是否保持滚动条的状态
ObjData.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.ComponentModel;

/// <summary>
/// OjbData 的摘要说明
/// </summary>
public class OjbData
{
         public OjbData()
        {
                 //
                 // TODO: 在此处添加构造函数逻辑
                 //
        }

        [DataObjectMethod(DataObjectMethodType.Select, true)]
         public DataTable Select()
        {
                DataTable dt = new DataTable();
                dt.Columns.Add( "no", typeof( string));
                dt.Columns.Add( "name", typeof( string));

                 for ( int i = 0; i < 30; i++)
                {
                        DataRow dr = dt.NewRow();
                        dr[0] = "no" + i.ToString().PadLeft(2, '0');
                        dr[1] = "name" + i.ToString().PadLeft(2, '0');

                        dt.Rows.Add(dr);
                }

                 return dt;
        }
}
 
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
        <title>SmartGridView测试</title>
</head>
<body>
        <form id="form1" runat="server">
                <yyc:SmartGridView ID="SmartGridView1" runat="server" AutoGenerateColumns="False"
                        DataSourceID="ObjectDataSource1" Width="1000px">
                        <Columns>
                                <asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" />
                                <asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" />
                                <asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" />
                                <asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" />
                                <asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" />
                                <asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" />
                                <asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" />
                                <asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" />
                                <asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" />
                                <asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" />
                        </Columns>
                        <FixRowCol FixColumnIndices="0,1" FixRowIndices="0" IsFixHeader="True" TableHeight="300px"
                                TableWidth="300px" EnableScrollState="true" />
                </yyc:SmartGridView>
                <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
                        TypeName="OjbData"></asp:ObjectDataSource>
        </form>
</body>
</html>
 
/*测试版的实现 结束*/
 

OK
[源码下载]

你可能感兴趣的:(职场,GridView,控件,休闲)