★搜Asp.net★(www.soAsp.net),为专业技术文档网站。
包括Asp.net开发技术文档·C#开发技术文档·Access/SQL Server数据库开发技术文档·VB.NET开发技术文档。
还包括·项目实战经验总结·开发经验技巧总结·项目开发心得。
GridView排序、分页
先看一下用GridView排序、分页的效果图。

下面给出具体实现的方法:

写一个定义控件,继承自System.Web.UI.WebControl.GridView,然后对其进行扩展。

分页的实现:

重写OnRowCreate方法,对PagerRow进行特殊处理,清空里面的控件,加入自己的控件。首页,尾页,上一页,下一页的做法是,往PagerRow中添加四个LinkButton,CommandName设成"Page",CommandArgument分别设成"First","Last","Prev","Next".相应的Text或者Image可直接使用PagerSettings属性中的数据。

直接跳转页和每页记录条数的实现相对麻烦一些。加入两个DropDownList控件,往里面填充数据,并在此类中处理它们的OnSelectedIndexChange事件,重置PageIndex和PageSize.

排序图标的实现:

同样在OnRowCreate方法中,对HeaderRow进行特殊处理,可根据SortExpression属性找到当前正在进行排序的列,根据SortDirection属性得到排序的顺序,根据这两个属性往特定的列添加特定的图标。

滚动条的实现:

重写RenderContents方法,改变原有的HTML流布局。如果不重写,原来的布局如下:

 

<Table>//-->GridView

     
<tr>//-->PagerRow,当PagerPosition设成Top或TopAndBottom的时候,这一行才会出现

     
</tr>

     
<tr>//-->HeaderRow

     
</tr>

     
<tr>//-->DataRow

     
</tr>

     ............

     
<tr>//-->DataRow

     
</tr>

     
<tr>//-->FooterRow

     
</tr>

     
<tr>//-->PagerRow(Bottom || TopAndBottom时出现)

</Table>

重写RenderContents的目的就是把整个GridView分隔成三(两)个Table,第一和第三个Table中放PagerRow部分,中间一个Table放在DIV中,固定DIV的高度,使其出现滚动条,对HeaderRow进行特殊处理,使其不会随滚动条的滚动而消失(方法是:style="top:expression(this.parentNode.parentNode.scrollTop);").然后再用一个Table把这三个Table包起来。重写后布局如下:

 

<Table>

   
<tr>

     
<td>

       
<Table>PagerRow</Table>

     
</td>

   
<tr>

   
<tr>

     
<td>

       
<DIV>

         
<Table>DataRow && FooterRow</Table>

       
</DIV>

     
</td>

    
</tr>

    
<tr>

      
<td>

         
<Table>PagerRow</Table>

      
</td>

    
</tr>

</Table>

 

接下来说一下具体实现:

1、新建一个Web Control Library类型的工程,命名为myControls,添加一个类myGridView.cs:代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
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.IO;
using System.ComponentModel;

namespace CRM2006.GridView
{
    
/// <summary>
    
/// Summary description for myGridView
    
/// </summary>
    
///

    public class CrmGV : System.Web.UI.WebControls.GridView
    
{
        
//private Unit _divheight;
        
//private int _offset;
        private bool isPagerCreated = false;
        
public CrmGV()
        
{
        }

        [
        Description(
"是否启用自定义分页功能"),
        Category(
"分页"), DefaultValue("false"),Themeable(true)
        ]
        
public bool AllowCustomerPagerSettings
        
{
            
get
            
{
                
object o = ViewState["AllowCustomerPagerSettings"];
                
return (o != null ? (bool)o : false);
            }

            
set
            
{
                ViewState[
"AllowCustomerPagerSettings"= value;
            }

        }

        [Localizable(
true), DefaultValue("Current page:"), Themeable(true)]
        
public string CurrentPageText
        
{
            
get
            
{
                
object o = ViewState["CurrentPageText"];
                
return (o != null ? o.ToString() : "Current page:");
            }

            
set
            
{
                ViewState[
"CurrentPageText"= value;
            }

        }

        [Localizable(
true), DefaultValue("Jump to page"), Themeable(true)]
        
public string JumpToPageText
        
{
            
get
            
{
                
object o = ViewState["JumpToPageText"];
                
return (o != null ? o.ToString() : "Jump to page");
            }

            
set
            
{
                ViewState[
"JumpToPageText"= value;
            }

        }

        [Localizable(
true), DefaultValue("Display{0}records per page"), Themeable(true)]
        
public string RecordCountPerPage
        
{
            
get
            
{
                
object o = ViewState["RecordCountPerPage"];
                
return (o != null ? o.ToString() : "Display{0}records per page");
            }

            
set
            
{
                ViewState[
"RecordCountPerPage"= value;
            }

        }

        [Description(
"The height of DIV element"), Themeable(true)]
        
public virtual Unit DIVHeight
        
{
            
get
            
{
                
object o = ViewState["DIVHeight"];
                
return new Unit(o.ToString());
            }

            
set
            
{
                ViewState[
"DIVHeight"= value; 
            }

        }

        [Description(
"Image Url for sort ascending"),Themeable(true), Editor("System.Web.UI.Design.UrlEditor"typeof(System.Drawing.Design.UITypeEditor))]//Editro特性:指定用以改变属性的编辑器
        public string SortAscImageUrl
        
{
            
get 
            
{
                
object o = ViewState["SortImageAsc"];
                
return (o != null ? o.ToString() : "");
            }

            
set
            
{
                ViewState[
"SortImageAsc"= value;
            }

        }

        [Description(
"Image Url for sort descending"),Themeable(true), Editor("System.Web.UI.Design.UrlEditor"typeof(System.Drawing.Design.UITypeEditor))]//Editro特性:指定用以改变属性的编辑器
        public string SortDescImageUrl
        
{
            
get
            
{
                
object o = ViewState["SortImageDesc"];
                
return (o != null ? o.ToString() : "");
            }

            
set
            
{
                ViewState[
"SortImageDesc"= value;
            }

        }

        [Description(
"OffSet Value of Head Row"), DefaultValue(4), Themeable(true)]
        
public int OffSet
        
{
            
get 
            
{
                
object o = ViewState["OffSet"];
                
return Convert.ToUInt16(o);
            }

            
set 
            
{
                
if (value <= 1)
                    ViewState[
"OffSet"= 1;
                
else
                    ViewState[
"OffSet"= value;
            }

        }

        
protected override void OnRowCreated(GridViewRowEventArgs e)
        
{
            
if (e.Row.RowType == DataControlRowType.Pager)
            
{
                
if (AllowCustomerPagerSettings)
                
{
                        CreateCustomerPager(e.Row);
                }


            }

            
else
            
{
                
if (e.Row.RowType == DataControlRowType.Header)
                
{
                    DisplaySortOrderImages(e.Row);
                }

            }

            
base.OnRowCreated(e);
        }

        
protected override void OnSorting(GridViewSortEventArgs e)
        
{
            
base.OnSorting(e);
            isPagerCreated 
= false;
        }


        
private void CreateCustomerPager(GridViewRow pager)
        
{
            pager.Controls[
0].Controls.Clear();
            Table tb 
= new Table();
            tb.Style.Add(
"width""100%");
            TableRow row
=new TableRow();
            pager.Controls[
0].Controls.Add(tb);
            tb.Rows.Add(row);
            TableCell firstCell 
= new TableCell();
            TableCell secCell 
= new TableCell();
            TableCell tmpCell 
= new TableCell();
            firstCell.Attributes[
"Align"= "left";
            secCell.Attributes[
"Align"]="right";
            row.Cells.Add(firstCell);
            row.Cells.Add(secCell);


            tb 
= new Table();
            firstCell.Controls.Add(tb);
            row 
= new TableRow();
            tb.Rows.Add(row);

            LinkButton lnk 
= new LinkButton();
            Label lbl 
= new Label();
            Image img 
= new Image();

            
if (PageIndex != 0)
            
{
                
//First
                tmpCell = new TableCell();
                tmpCell.Attributes[
"vAlign"= "middle";
                lnk.CommandArgument 
= "First";
                lnk.CommandName 
= "Page";
                lnk.CausesValidation 
= false;
                
if (PagerSettings.FirstPageImageUrl == String.Empty || PagerSettings.FirstPageImageUrl == null)
                    lnk.Text 
= (PagerSettings.FirstPageText == String.Empty || PagerSettings.FirstPageText == null ? "First" : PagerSettings.FirstPageText);
                
else
                
{
                    img.ImageUrl 
= PagerSettings.FirstPageImageUrl;
                    lnk.Text 
= "";
                    lnk.Controls.Add(img);
                }

                tmpCell.Controls.Add(lnk);
                row.Cells.Add(tmpCell);

                
//Preview
                lnk = new LinkButton();
                tmpCell 
= new TableCell();
                tmpCell.Attributes[
"vAlign"= "middle";
                img 
= new Image();
                lnk.CommandArgument 
= "Prev";
                lnk.CommandName 
= "Page";
                lnk.CausesValidation 
= false;
                
if (PagerSettings.PreviousPageImageUrl == String.Empty || PagerSettings.PreviousPageImageUrl == null)
                    lnk.Text 
= (PagerSettings.PreviousPageText == String.Empty || PagerSettings.PreviousPageText == null ? "Prev" : PagerSettings.PreviousPageText);
                
else
                
{
                    img.ImageUrl 
= PagerSettings.PreviousPageImageUrl;
                    lnk.Text 
= "";
                    lnk.Controls.Add(img);
                }

                tmpCell.Controls.Add(lnk);
                row.Cells.Add(tmpCell);
            }


            
//Current
            tmpCell = new TableCell();
           &