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

扩展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);        }