扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源
最近项目View层越来越趋向于无刷新化,特别是数据展示方面,还要对Linq有很好的支持. 下载地址:http://files.cnblogs.com/dint/TComponentsTest_V_1_0_3.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,Dint.TwfWebox.EGridViewSortArgs eSort)
{
DataBinder(ePage.NewPageIndex,eSort.SortExpression,eSort.SortDirection);
}
1 <cc1:TwfGridView ID="TwfGridView1" runat="server" 2 onpagesorting="TwfGridView1_PageSorting" AjaxViewState="False" 3 AllowPaging="True" AllowSorting FocusBgColor="" jQuerySupport="True" 4 LoadMsg="正在加载数据..."> 5 EPagerSetting NavButton="PrevNumNext" ClassName="TwfGv_All" NavMessageBarCss="TwfGv_NavMessage" 6 NumBtnBarCss="TwfGv_NumBtnBar" CurrentNumBtnCss="TwfGv_CurrNumBtn" PrevNextBtnCss="TwfGv_PrevNextBtn" 7 DisabledPrevNextBtnCss="TwfGv_PrevNextDisable" PagerInfoFormatter="<每页 {RecordCount} 条 共 {TotalCount} 条 当前第 {PageIndex}/{PageCount} 页>" 8 GoToBarEnable GotoBtnText="转到" GoToDropdown="DropdownSubmit" 9 GotoClassName="TwfGv_Goto" GotoTxtCss="TwfGv_Goto_Txt"></EPagerSetting10 ESortSetting SortAscCss="TwfGv_SortAsc" SortDescCss="TwfGv_SortDesc" SortDefaultCss="TwfGv_SortDef" 11 AscFormatter="{0}↑" DescFormatter="{0}↓"ESortSetting12 PagerSettings FirstPageText="首页" LastPageText="末页" NextPageText="下一页" PreviousPageText="上一页"PagerSettings13 </cc1:TwfGridView> 快捷设计时: 分页排序效果: 当前焦点行颜色效果: ? 下拉页选择效果: ? 具体实现原理: 1.重写DataSource属性 适应不同数据源 1 /// <summary> 2 /// 获取或设置数据源 支持 DataTable,DataView,ICollection,ITwfRecordCount,IQueryable 等类型的数据源 3 </summary> 4 public override object DataSource 5 { 6 get 7 { 8 return base.DataSource; 9 } 10 set 11 12 IListSource dtSource = value as IListSource; 13 if (dtSource != null){ 14 _RecordCount = dtSource.GetList().Count; 15 } 16 else{ 17 ITwfRecordCount trcSource = value ITwfRecordCount; 18 if (trcSource != 19 _RecordCount = trcSource.RecordCount(); 20 } 21 22 ICollection cletSource = value ICollection; 23 if (cletSource != 24 _RecordCount = cletSource.Count; 25 } 26 27 IEnumerable aEnum = value IEnumerable; 28 if (aEnum != ) { 29 IEnumerator aEnumtor = aEnum.GetEnumerator(); 30 if (aEnumtor != ) 31 { 32 int iCount = 0; 33 aEnumtor.Reset(); 34 while (aEnumtor.MoveNext())iCount++35 _RecordCount = iCount; 36 } 37 } 38 39 40 41 VsRecordCount = _RecordCount; 42 base.DataSource = value; 43 44 }
1 private void RenderHtml(HtmlTextWriter defWriter) 2 3 if (Page != 4 5 Page.VerifyRenderingInServerForm(this); 6 StringBuilder strBuilder = new StringBuilder(2048 7 StringWriter strWriter = new StringWriter(strBuilder); 8 HtmlTextWriter htmlWriter = HtmlTextWriter(strWriter); 9 .RenderChildren(htmlWriter); 10 string strVs="",strEvl=""11 TransferFormState(ref strVs,ref strEvl); 12 RspCallBackResult(string.Format("SUCCE{0},{1},{2},{3}~{4},{5},{6}~{8}~{9}~{7}",PageIndex.ToString().PadLeft(4,'0'),13 PageCount.ToString().PadLeft('),1)">0000",aSort.ColumnIndex.ToString(),1)">14 aSort.SortExpression,aSort.DirectString,strBuilder.ToString(),strVs,strEvl)); 16 17 .RenderChildren(defWriter); 18 19 }
1 void TransferFormState(ref string rVstate,1)">string rEvl) if (_AjaxViewState && isVsSupport) 5 MethodInfo ptrM = Page.GetType().GetMethod(DecomposeViewStateIntoChunks 6 BindingFlags.Instance | BindingFlags.NonPublic); 7 ICollection ivs = ptrM.Invoke(Page,1)">null) if ((ivs != null) && (ivs.Count > )) { 10 StringBuilder strBuilder = 102411 int num = 0,ivc = ivs.Count - 112 foreach (string s in ivs) 13 { strBuilder.Append(s); 15 if (num < ivc) strBuilder.Append(#16 num++17 18 rVstate = strBuilder.ToString(); 19 20 if (Page.EnableEventValidation) 21 22 ptrM = Page.ClientScript.GetType().GetMethod(GetEventValidationFieldValue23 BindingFlags.Instance |24 rEvl = ((ptrM.Invoke(Page.ClientScript,1)">as string) ?? 26 27 }
1 class TwfGridDesignerActionList : DesignerActionList { 3 private TwfGridView twfGridView; public TwfGridDesignerActionList(IComponent component) : (component) { 5 twfGridView = component TwfGridView; 6 } 8 void SetProperty(string propertyName,1)"> value) 10 TypeDescriptor.GetProperties(twfGridView)[propertyName].SetValue(twfGridView,value); override DesignerActionItemCollection GetSortedActionItems() 14 DesignerActionItemCollection nitem = DesignerActionItemCollection(); 15 nitem.Add(new DesignerActionHeaderItem(扩展分页/排序kzfypx)); 16 nitem.Add(new DesignerActionPropertyItem(AllowPaging允许分页17 nitem.Add(AllowSorting允许排序18 nitem.Add(GotoEnable启用'转到'按钮19 nitem.Add(StateMode视图状态Part:部分状态rnNone:无状态rnAll:完全状态20 nitem.Add(new DesignerActionMethodItem(this,1)">About关于 TwfGridView ...true21 return nitem; 22 23 [EditorBrowsable(EditorBrowsableState.Never)] 24 bool GotoEnable 26 get27 .twfGridView.EPagerSetting.GoToBarEnable; 28 29 30 31 TypeDescriptor.GetProperties(twfGridView.EPagerSetting)[GoToBarEnable].SetValue(twfGridView.EPagerSetting,1)">32 AllowPaging = AllowPaging; 34 35 37 About() 39 ( FrmAbout()).ShowDialog(); 41 42 AllowSorting { 43 get { .twfGridView.AllowSorting; } 44 set { SetProperty(45 46 47 AllowPaging 48 49 .twfGridView.AllowPaging; } 50 51 52 53 public TwfGridViewStateMode StateMode 54 55 { 56 if (!this.twfGridView.EnableViewState) TwfGridViewStateMode.None; 57 this.twfGridView.AjaxViewState) TwfGridViewStateMode.Part; 58 TwfGridViewStateMode.All; 59 60 set61 switch (value) 62 63 case TwfGridViewStateMode.None: 64 SetProperty(EnableViewStatefalse65 SetProperty(AjaxViewState66 break67 TwfGridViewStateMode.Part: 68 SetProperty(69 SetProperty(70 71 TwfGridViewStateMode.All: 72 SetProperty(73 SetProperty(74 75 default: 76 throw new Exception(error param77 78 79 80 81 } ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC对不存在的用户进行身份验证和授权
- asp.net-mvc – 如何在ASP.net控制器操作中访问整个查询字符
- asp.net-mvc – 新ASP.NET MVC 6身份中AspNetUsers表中的Co
- asp.net-mvc – 使用OWIN进行基于区域的身份验证
- asp.net – MVC 6 – RC1到RC2的更改
- 在ASP.NET中,HTML指令符号<%#或<%= etc?在服务器端执行
- 使用NUnit与ASP.NET WebApi控制器执行集成测试
- asp.net – Sitecore:打开HTML缓存阻止回发行为
- 使用ASP.NET和IIS进行多线程处理
- asp.net-mvc – 具有适当的敲除绑定的网格小部件
- asp.net-mvc – Asp.Net MVC Ajax.BeginForm没有
- asp.net-mvc – ActionExecutingContext – Acti
- 一步一步创建ASP.NET MVC5程序[Repository+Autof
- ASP.NET存储SQL中的图像并检索Asp:Image
- 仅为匿名用户缓存ASP.NET页面
- asp.net-mvc – 如何在共享托管环境中实现ASP.Ne
- ASP.NET MVC5 中百度ueditor富文本编辑器的使用(
- asp.net mvc jquery ui datepicker绑定问题
- “超频”处理ASP.NET应用的技术
- .net – 如何使单元测试可以使用HttpContext?