增强 GridView 控件的功能

还记得雅虎的XX(不好意思,忘记姓甚名谁了)有一篇演讲,其中一个字就是“懒”。咱写代码的,不懒点儿还真是吃不消,尤其是现在这样要命的天气~~。

相信大家都多少有抱怨GridView控件的功能吧,咱在这就不多说了,贴出代码是最重要的。

效果图

该类增强了微软的GridView的功能,增加了“首页”、“上页”、“下页”、“尾页”按钮,方便大家使用,翻页事件也已经添加好,在相关页面只要添加以下代码就可以了:

    protected void Page_Init(object sender, EventArgs e) {
        Lyout.Web.Extension.GridView.RegisterEvents(listTable, 
new Lyout.Web.Extension.GridViewDataBind(BindData));
    }

记住必须在 Page_Init 里面。其中 listTable 为GridView控件的ID,BindData是自己绑定数据的方法的名称。

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Lyout.Web.Extension {
    
/// <summary>
    
/// GridView 数据绑定委托
    
/// </summary>

    public delegate void GridViewDataBind();

    
/// <summary>
    
/// 增强 GridView 的功能
    
/// </summary>

    public sealed class GridView {
        
/// <summary>
        
/// 给指定的GridView控件添加RowCommand、RowCreated、PageIndexChanged事件
        
/// </summary>
        
/// <param name="gridView">需要注册事件的GridView控件</param>

        public static void RegisterEvents(System.Web.UI.WebControls.GridView gridView) {
            RegisterEvents(gridView, 
nulltrue);
        }


        
/// <summary>
        
/// 给指定的GridView控件添加RowCommand、RowCreated、PageIndexChanged事件
        
/// </summary>
        
/// <param name="gridView">需要注册事件的GridView控件</param>
        
/// <param name="dataBind">数据绑定方法</param>

        public static void RegisterEvents(System.Web.UI.WebControls.GridView gridView, GridViewDataBind dataBind) {
            RegisterEvents(gridView, dataBind, 
true);
        }


        
/// <summary>
        
/// 给指定的GridView控件添加RowCommand、RowCreated、PageIndexChanged事件
        
/// </summary>
        
/// <param name="gridView">需要注册事件的GridView控件</param>
        
/// <param name="dataBind">数据绑定方法</param>
        
/// <param name="pageText">翻页按钮上的文字</param>

        public static void RegisterEvents(System.Web.UI.WebControls.GridView gridView, GridViewDataBind dataBind, string[] pageText) {
            RegisterEvents(gridView, dataBind, pageText, 
true);
        }


        
/// <summary>
        
/// 给指定的GridView控件添加RowCommand、RowCreated、PageIndexChanged事件
        
/// </summary>
        
/// <param name="gridView">需要注册事件的GridView控件</param>
        
/// <param name="dataBind">数据绑定方法</param>
        
/// <param name="autoChangePage">是否自动添加点击页码的相应事件</param>

        public static void RegisterEvents(System.Web.UI.WebControls.GridView gridView, GridViewDataBind dataBind, bool autoChangePage) {
            RegisterEvents(gridView, dataBind, 
null, autoChangePage);
        }


        
/// <summary>
        
/// 给指定的GridView控件添加RowCommand、RowCreated、PageIndexChanged事件
        
/// </summary>
        
/// <param name="gridView">需要注册事件的GridView控件</param>
        
/// <param name="dataBind">数据绑定方法</param>
        
/// <param name="pageText">翻页按钮上的文字</param>
        
/// <param name="autoChangePage">是否自动添加点击页码的相应事件</param>

        public static void RegisterEvents(System.Web.UI.WebControls.GridView gridView, GridViewDataBind dataBind, string[] pageText, bool autoChangePage) {
            gridView.RowCommand 
+= delegate(object sender, GridViewCommandEventArgs e) {
                RowCommand(sender, e, dataBind);
            }
;
            gridView.RowCreated 
+= delegate(object sender, GridViewRowEventArgs e) {
                RowCreated(sender, e, pageText);
            }
;
            
if (autoChangePage) {
                gridView.PageIndexChanging 
+= delegate(object sender, GridViewPageEventArgs e) {
                    gridView.PageIndex 
= e.NewPageIndex;
                    
if (dataBind != null{
                        dataBind();
                    }
 else {
                        gridView.DataBind();
                    }

                }
;
            }

        }


        
/// <summary>
        
/// 点击每行触发的命令,自动绑定。用于自定义数据绑定方法写在if(!Page.IsPostBack){}外。
        
/// </summary>

        public static void RowCommand(object sender, GridViewCommandEventArgs e) {
            RowCommand(sender, e, 
null);
        }


        
/// <summary>
        
/// 点击每行触发的命令,需提供数据绑定方法。用于自定义数据绑定方法写在if(!Page.IsPostBack){}内。
        
/// </summary>
        
/// <param name="function">数据绑定方法</param>

        public static void RowCommand(object sender, GridViewCommandEventArgs e, GridViewDataBind dataBind) {
            System.Web.UI.WebControls.GridView _grid 
= (System.Web.UI.WebControls.GridView)sender;
            SetPageIndex(_grid, e.CommandName);
            
if (dataBind != null{
                dataBind();
            }
 else {
                _grid.DataBind();
            }

        }


        
/// <summary>
        
/// 增加首页、上页、下页、尾页按钮
        
/// </summary>

        public static void RowCreated(object sender, GridViewRowEventArgs e) {
            RowCreated(sender, e, 
null);
        }


        
/// <summary>
        
/// 增加首页、上页、下页、尾页按钮
        
/// </summary>
        
/// <param name="buttonText">按钮上的文字。索引:0 首页 1 上页 2 下页 3 尾页</param>

        public static void RowCreated(object sender, GridViewRowEventArgs e,string[] buttonText) {
            
if(e.Row.RowType == DataControlRowType.Pager) {
                System.Web.UI.WebControls.GridView _grid 
= (System.Web.UI.WebControls.GridView)sender;
                
if(_grid.PagerTemplate == null{
                    _grid.PagerSettings.Mode 
= PagerButtons.Numeric;

                    
int pageIndex = _grid.PageIndex;
                    
int pageCount = _grid.PageCount;

                    TableRow objRow 
= (TableRow)e.Row.Cells[0].Controls[0].Controls[0];
                    TableCell objCell;

                    
string[] button = {"首页","上页","下页","尾页"};
                    
if(buttonText != null{
                        
for(int i = 0; i < buttonText.Length; i++{
                            button[i] 
= buttonText[i];
                        }

                    }


                    
bool enabled = true;

                    enabled 
= pageIndex > 0 ? true : false;

                    
// 增加首页、上一页按钮
                    objCell = new TableCell();
                    objCell.Controls.Add(LinkButton(button[
0], "Page$First""", enabled));
                    objRow.Cells.AddAt(
0, objCell);

                    objCell 
= new TableCell();
                    objCell.Controls.Add(LinkButton(button[
1], "Page$Prev""", enabled));
                    objRow.Cells.AddAt(
1, objCell);

                    enabled 
= pageIndex < (pageCount - 1? true : false;

                    
// 增加尾页、下一页按钮
                    objCell = new TableCell();
                    objCell.Controls.Add(LinkButton(button[
2], "Page$Next""", enabled));
                    objRow.Cells.Add(objCell);

                    objCell 
= new TableCell();
                    objCell.Controls.Add(LinkButton(button[
3], "Page$Last""", enabled));
                    objRow.Cells.Add(objCell);
                }

            }

        }


        
/// <summary>
        
/// 设置GridView的页索引
        
/// </summary>
        
/// <param name="command">被单击的按钮的命令</param>

        private static void SetPageIndex(System.Web.UI.WebControls.GridView gridView, string command) {
            
switch(command) {
                
case "Page$First":
                    gridView.PageIndex 
= 0;
                    
break;
                
case "Page$Prev":
                    
if(gridView.PageIndex > 0)
                        gridView.PageIndex 
-= 1;
                    
break;
                
case "Page$Next":
                    
if(gridView.PageIndex < (gridView.PageCount - 1))
                        gridView.PageIndex 
+= 1;
                    
break;
                
case "Page$Last":
                    gridView.PageIndex 
= gridView.PageCount - 1;
                    
break;
                
default:
                    
return;
            }

        }


        
/// <summary>
        
/// 一个新的LinkButton对象
        
/// </summary>
        
/// <param name="text">文本</param>
        
/// <param name="cmd">相应命令</param>
        
/// <param name="css">Css风格</param>
        
/// <param name="enabled">可用</param>
        
/// <returns>LinkButton</returns>

        private static LinkButton LinkButton(string text, string cmd, string css, bool enabled) {
            LinkButton button 
= new LinkButton();
            button.Text 
= text;
            button.CommandName 
= cmd;
            button.CssClass 
= css;
            button.Enabled 
= enabled;
            button.CausesValidation 
= false;
            
return button;
        }

    }

}

posted on 2007-06-02 21:14 里奥特 阅读(3729) 评论(23)  编辑 收藏 所属分类: .NET

评论

#1楼  2007-06-02 21:34 Justin         回复  引用  查看    

cool~

#2楼 [楼主] 2007-06-02 21:37 里奥特         回复  引用  查看    

@Justin
谢谢支持!

#3楼  2007-06-03 03:29 后台运行中…… [未注册用户]   回复  引用    

请问效率如何?

#4楼  2007-06-03 08:38 oy2008 [未注册用户]   回复  引用    

同樣關注效能的問題

#5楼 [楼主] 2007-06-03 11:28 里奥特         回复  引用  查看    

效率和原来的一样,一看代码就知道了,没有添加任何额外的处理。:D

#6楼  2007-06-04 08:54 章江西岸 [未注册用户]   回复  引用    

应该再增加一个按钮:输出到Excel;这也是常用的.

#7楼 [楼主] 2007-06-04 09:14 里奥特         回复  引用  查看    

@章江西岸
嗯,说得有道理,下次更新的时候加上.

#8楼  2007-06-04 09:17 <img> [未注册用户]   回复  引用    

@章江西岸
可以自己把这块功能补上啊!

#9楼  2007-06-04 10:47 匆匆的过客 [未注册用户]   回复  引用    

加个【保存】,
可以选择格式:图片,xls,csv,等

#10楼  2007-06-04 10:48 匆匆的过客 [未注册用户]   回复  引用    

再加个自定义,可以自定义列的隐藏,显示,顺序,并且可以记住用户的保存

#11楼  2007-06-04 11:28 Dicky [未注册用户]   回复  引用    

不错!!

#12楼  2007-06-04 12:39 巫云         回复  引用  查看    

谢谢,指导,先看看,^_^。

#13楼  2007-06-04 13:37 大剑师         回复  引用  查看    

呵呵,原始的DataGrid方式
当然效率没有问题

#14楼  2007-06-12 19:06 dumingqing [未注册用户]   回复  引用    

太感谢了!这段代码省了很多事情 谢谢.
下面这段是不是有点问题啊,编辑的时候 e.RowIndex 总是为0 是不是要过滤一下啊
/**//// <summary>
/// 点击每行触发的命令,需提供数据绑定方法。用于自定义数据绑定方法写在if(!Page.IsPostBack){}内。
/// </summary>
/// <param name="function">数据绑定方法</param>
public static void RowCommand(object sender, GridViewCommandEventArgs e, GridViewDataBind dataBind) {
System.Web.UI.WebControls.GridView _grid = (System.Web.UI.WebControls.GridView)sender;
SetPageIndex(_grid, e.CommandName);
if (dataBind != null) {
dataBind();
} else {
_grid.DataBind();
}
}

#15楼 [楼主] 2007-06-14 09:40 里奥特         回复  引用  查看    

@dumingqing
不客气

这几天改进一下,再加个导出的一起发上来..

#16楼  2007-06-15 01:53 dumingqing [未注册用户]   回复  引用    

期待........

#17楼 [楼主] 2007-06-16 23:04 里奥特         回复  引用  查看    

@dumingqing
@匆匆的过客

最新的请到这里查看
http://www.cnblogs.com/lyout/archive/2007/06/16/786019.html

#18楼  2008-01-29 09:32 @mi [未注册用户]   回复  引用    

你们试着都没问题么?
为什么我这是显示了上一页下一页 首业跟尾页,但是功能实现不了,,???

#19楼 [楼主] 2008-01-29 19:27 里奥特         回复  引用  查看    

@@mi
请问你添加了以下代码吗?

protected void Page_Init(object sender, EventArgs e) {
Lyout.Web.Extension.GridView.RegisterEvents(listTable, new Lyout.Web.Extension.GridViewDataBind(BindData));
}

#20楼  2008-06-26 14:15 阿曼 [未注册用户]   回复  引用    

protected void Page_Init(object sender, EventArgs e) {
Lyout.Web.Extension.GridView.RegisterEvents(listTable, new Lyout.Web.Extension.GridViewDataBind(BindData));
}

这个代码该如何用。

#21楼 [楼主] 2008-07-06 11:54 里奥特         回复  引用  查看