扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView

最近项目View层越来越趋向于无刷新化,特别是数据展示方面,还要对Linq有很好的支持.
在WebFrom模式的开发中,GridView是一个功能很强大,很常用的控件,但是他也不是完美的,没有自带的无刷新和排序(有人说UpdatePanel或第三方插件就可以实现无刷新,但是呵呵...那是重量级的无刷新实现,相信不少朋友和我一样讨厌UpdatePanel,
引入一大堆很长的js库且不说,用起来感觉不到一点无刷新带来的快速),也不支持部分数据绑定分页(有人说部分数据绑定也可以用aspNetPager等第三方插件很好的实现,但是那个插件能在一个事件里搞定分页和排序吗,还是无刷新的),
我也网上找了很多,但都不是很好用,很多还不提供源代码,所以自己实现了一个
具体功能如下:
1.由于是扩展实现.net中自带的GridView 所以GridView的功能她都有
2.支持部分数据绑定,节约服务器资源(即DataSource只需指定当前要显示页的数据,而不需要像自带的GridView一样DataSource为整个数据源)
3.无刷新分页,可自定义分页栏,分页按钮样式
4.无刷新排序,可自定义排序栏,排序按钮的样式
5.自定义无刷新操作后的视图状态[ViewState](1.禁用视图状态 2.只维护数据的视图状态 3.维护全部数据和子控件的视图状态)
6.简化事件处理,排序和分页只需一个事件

下载地址:http://files.cnblogs.com/dint/TComponentsTest.rar

不同数据源的绑定:

DataTable:

        private void BindSource()
        {
            DataTable dtPersons = new DataTable();
            dtPersons.Columns.Add("Name");
            dtPersons.Columns.Add("Age");
            dtPersons.Columns.Add("Address");
            dtPersons.Columns.Add("Sex");
            for (int i = 1, il = 5000; i <= il; i++)
            {
                DataRow nrow = dtPersons.NewRow();
                nrow[0] = "Name" + i.ToString();
                nrow[1] = "Age" + i.ToString();
                nrow[2] = "Address" + i.ToString();
                nrow[3] = "Sex" + i.ToString();
                dtPersons.Rows.Add(nrow);
            }

            TwfGridView1.DataSource = dtPersons;
            TwfGridView1.DataBind();
        }

List,Linq:

        private void BindSource()
        {
            List<Person> lstPersons = new List<Person>();
            for (int i = 1, il = 2000; i <= il; i++)
            {
                Person p = new Person()
                {
                    Id=i,
                    Name = "Name" + i.ToString(),
                    Age = "Age" + i.ToString(),
                    Address = "Address" + i.ToString(),
                    Sex = "Sex" + i.ToString()
                };
                lstPersons.Add(p);
            }

            TwfGridView1.DataSource = lstPersons;
            TwfGridView1.DataBind();
        }

分页排序事件,部分数据源(EntityFramework数据操作,其他的类似):



//部分数据源绑定需调用,重载的DataBind(int pageIndex,int allRecordCount)方法
private void DataBinder(int pageindex, string sortexp, SortDirection? direct)
        {

            using (var db = new EFDbContext(@"Data Source=.;Initial Catalog=dbtest;Integrated Security=true;"))
            {
                var results = db.Persons.Where(x => x.Id < 500);
                int rc = results.Count();
                int ps = (rc % TwfGridView1.PageSize == 0) ? rc / TwfGridView1.PageSize : rc / TwfGridView1.PageSize + 1;
                if (pageindex > ps - 1) pageindex = ps - 1;
                var v= results;

                if (sortexp == "Id")
                {
                    if (direct == SortDirection.Descending)
                    {
                        v = v.OrderByDescending(x => x.Id);
                    }
                    else
                    {
                        v = v.OrderBy(x => x.Id);
                    }
                }
                else if (sortexp == "Name")
                {
                    if (direct == SortDirection.Descending)
                    {
                        v = v.OrderByDescending(x => x.Name);
                    }
                    else
                    {
                        v = v.OrderBy(x => x.Name);
                    }
                }
                else if (sortexp == "Age")
                {
                    if (direct == SortDirection.Descending)
                    {
                        v = v.OrderByDescending(x => x.Age);
                    }
                    else
                    {
                        v = v.OrderBy(x => x.Age);
                    }
                }
                else if (sortexp == "Sex")
                {
                    if (direct == SortDirection.Descending)
                    {
                        v = v.OrderByDescending(x => x.Sex);
                    }
                    else
                    {
                        v = v.OrderBy(x => x.Id);
                    }
                }
                else if (sortexp == "Address")
                {
                    if (direct == SortDirection.Descending)
                    {
                        v = v.OrderByDescending(x => x.Address);
                    }
                    else
                    {
                        v = v.OrderBy(x => x.Address);
                    }
                }
                else { v = v.OrderBy(x => x.Id); }
                v = v.Skip(pageindex * TwfGridView1.PageSize).Take(TwfGridView1.PageSize);
                TwfGridView1.DataSource =v.ToList();
                TwfGridView1.DataBind(pageindex, rc);//注意重载了DataBind方法
            }
        }

        protected void TwfGridView1_PageSorting(object sender, GridViewPageEventArgs ePage, TwfComponents.EGridViewSortArgs eSort)
        {
            DataBinder(ePage.NewPageIndex, eSort.SortExpression, eSort.SortDirection);
        }

  

扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView

时间: 2024-10-22 18:43:34

扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView的相关文章

MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)

我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下来我就将做一个模仿淘宝已买到的宝贝功能,不过我的是无刷新分页的. 至于为何要用无刷新分页(局部刷新)呢,我个人觉得有几点原因: 提高用户体验,无刷新分页网页看起来相对静止,滚轮不会跳到上面,加载速度比较快: 减轻网站服务器压力,返回局部页面(其中无需包含样式和脚本)肯定比返回整个页面要来的轻松: 还有个分页的好处就是减轻数据库的压力,返回几行的数据肯定比返回所有

smarty+php+ajax 简单无刷新分页

简介 分页,无非就是从数据库中获得我们想查询的数据,再加以处理即可! ① 确定数据总数($count) ② 每页显示数据条数($pageSize) ③ 分多少页($pageCount) ④ 上一页($pagePrev) ⑤ 下一页($pageNext) ⑥ 判断越界问题 ⑦ 偏移量($offset) ⑧ sql语句($sql = "select * from goods limit $offset,$pageSize";) 简单归简单,我们还得考虑实际的应用.例如:如果你正在土豆网看&

无刷新分页

无刷新分页要用到自己定义的存储过程: alter proc usp_DivMemberByPage @pageIndex int, @pageSize int, @total int output //注意:这里不要忘记output as begin select * from ( select *,row_number() over(order by uId asc) RowId from Member ) Temp where Temp.RowId between (@pageIndex-1

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

phpcms无刷新分页

控制器添加一个函数: 添加一个静态页面ajax_message.html,在页面中添加如下代码: 在要分页的页面(我的是"show"页面)中添加如上图代码: phpcms无刷新分页 2016-05-30 17:17:30 标签:ajaxphpcms分页it教育 控制器添加一个函数 添加一个静态页面ajax_message.html,在页面中添加如下代码:

MVC简单分页(未实现无刷新分页)

分页Html辅助方法 using System.Text; using System.Web: using System.Web.Mvc; namespace System.Web.Mvc { public static class HtmlExtensions { #region 分页Html辅助方法 /// <summary> /// 分页Html辅助方法 /// </summary> /// <param name="htmlHelper">&

jQuery+AJAX+Struts实现无刷新分页

jQuery+AJAX+Struts实现无刷新分页 说明: 1.需要jQuery插件js文件: 2.使用myeclipse添加struts能力: 从前从客户端页面向服务器发送Ajax请求,需要在js中先创建XMLHttpRequest对象,对象创建好以后使用OPEN('GET/POST',URL,同步/异步)设置提交方式,URL地址,使用同步还是异步方式.然后使用send(data)向服务器发送数据,同时使用onreadystatechange来绑定回调函数.如果是使用GET方式提交数据,那么就

asp.net MVC4 +MVCpager 无刷新分页

本人菜鸟,最近在用MVC4和MVCpager做无刷新分页时,发现点击下一页时数据不是Ajax提交的,弄了好久终于找到原因,原来还是Jquery引用的问题,现在把代码粘出来,希望能帮到刚接触的程序员,第一次自己写博客,文才不好,有什么改进的地方还希望大神多多指教. 1 using Webdiyer.WebControls.Mvc; 2 namespace MVCPage.Controllers 3 { 4 public class HomeController : Controller 5 { 6

asp.net练习②——Paginaton无刷新分页

aspx代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>无刷新分页</title> <link href="c