easyui datagrid动态绑定列名和数据

本文介绍了一种在easyUI的datagrid中实现动态显示不同权限下表格字段的方法。通过对easyUI类库进行修改,并结合自定义的JDataGrid类,实现了根据权限加载不同的列配置和数据。此方案适用于需要按权限定制展示内容的应用场景。

公司有这么一个需求,根据不同的权限显示一张表不同的字段。这个要命的需求给UI层带来不少麻烦,首先,我们采用easyUI的datagrid显示表格数据,而表格的列是静态写死的,如果要根据不同权限显示不同的字段导致必须通过结果集来show字段,但是easyUI的源代码中是ajax拿到数据后直接根据列去显示,使得我不得不修改easyUI类库。

先说一下思路:首先UI的datagrid中没有指定任何列,ajax提交成功后同时返回列的信息,先进行列的动态绑定,然后显示数据内容。

1.UI

Code:
  1. <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="DynamicDatagird.aspx.cs"
  2. Inherits="WebUtils.DynamicDatagird"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <htmlxmlns="http://www.w3.org/1999/xhtml">
  5. <headrunat="server">
  6. <title>动态datagrid</title>
  7. <scriptsrc="Scripts/jquery-1.4.1.js"type="text/javascript"></script>
  8. <scriptsrc="Scripts/jquery.easyui.min.js"type="text/javascript"></script>
  9. <linkhref="Style/themes/default/easyui.css"rel="stylesheet"type="text/css"/>
  10. <scripttype="text/javascript">
  11. $(function(){
  12. $('#tbUsers').datagrid({
  13. title:'MyTitle',
  14. width:600,
  15. height:350,
  16. dataType:'json',
  17. url:'GetAjaxData.ashx?action=GetUserList2',
  18. columns:[[]],
  19. pagination:true,
  20. pageSize:5,//每页记录数
  21. pageList:[5,10,15,20,30,50],//分页记录数数组
  22. onLoadSuccess:function(data,param){
  23. }
  24. });
  25. });
  26. </script>
  27. </head>
  28. <body>
  29. <formid="form1"runat="server">
  30. <div>
  31. <tableid="tbUsers">
  32. </table>
  33. </div>
  34. </form>
  35. </body>
  36. </html>

2.easyUI类库的修改(位置在datagrid ajax提交位置L6220处)

Code:
  1. function_43f(){
  2. $.ajax({type:opts.method,url:opts.url,data:_43d,dataType:"json",success:function(data){
  3. //动态添加列
  4. if(!!data&&!!data.columns){
  5. varopts=$.data(_43a,"datagrid").options;
  6. var_369=$.data(_43a,"datagrid").panel;
  7. varcols=$.data(_43a,"datagrid").options.columns[0];
  8. varcolCount=cols.length;
  9. if(colCount==0){
  10. //cols.slice(0,cols.length);//清除数组内容
  11. for(vari=0;i<data.columns.length;i++){
  12. varcol={
  13. field:data.columns[i].field,
  14. title:data.columns[i].title,
  15. width:data.columns[i].width,
  16. align:data.columns[i].align
  17. };
  18. cols.push(col);
  19. }
  20. //UI添加列
  21. if(colCount==0&&opts.columns){
  22. vart=_370(opts.columns);
  23. $("div.datagrid-view2div.datagrid-header-inner",_369).html(t);
  24. }
  25. }
  26. }
  27. setTimeout(function(){
  28. _440();
  29. },0);
  30. if(!!data&&!!data.rows){
  31. _3a2(_43a,data);
  32. }
  33. setTimeout(function(){
  34. _42d(_43a);
  35. },0);
  36. },error:function(){
  37. setTimeout(function(){
  38. _440();
  39. },0);
  40. if(opts.onLoadError){
  41. opts.onLoadError.apply(_43a,arguments);
  42. }
  43. }
  44. });
  45. };

3.后台提供数据(一般处理程序)

Code:
  1. publicvoidGetUserList(HttpContextcontext){
  2. stringstrJson=@"{
  3. 'total':20,
  4. 'rows':[
  5. {'name':'zhangsan01','age':'21','hobby':'001'},
  6. {'name':'zhangsan02','age':'21','hobby':'001'},
  7. {'name':'zhangsan03','age':'21','hobby':'001'},
  8. {'name':'zhangsan04','age':'21','hobby':'001'},
  9. {'name':'zhangsan05','age':'21','hobby':'001'}
  10. ],
  11. 'columns':[
  12. {'field':'name','title':'Name','width':100,'align':'center'},
  13. {'field':'age','title':'Age','width':100,'align':'center'},
  14. {'field':'hobby','title':'Hobby','width':100,'align':'center'}
  15. ]
  16. }";
  17. strJson=strJson.Replace("'","/"");
  18. HttpResponseresponse=context.Response;
  19. response.ContentType="text/json";
  20. response.Write(strJson);
  21. }

这样就完成了动态绑定列名。功能是可以了,还不利于大量生产,需要提供自动集合转Json的类。
为此,我设计了一个JDataGrid类用于将List的集合生成我的DataGrid需要的数据格式(包含列的信息)。

1.定义User类,就作为实体类

Code:
  1. namespaceWebUtils{
  2. publicclassUser{
  3. publicstringName{get;set;}
  4. publicintAge{get;set;}
  5. publicstringGender{get;set;}
  6. publicstringHobby{get;set;}
  7. }
  8. }

2.定义JDataGrid类和JColumn类

Code:
  1. publicclassJDataGrid{
  2. publicinttotal{get;set;}
  3. publicList<Dictionary<string,object>>rows{get;set;}
  4. publicList<JColumn>columns{get;set;}
  5. publicstaticList<Dictionary<string,object>>ConvertRows(IListlist){
  6. List<Dictionary<string,object>>rowsList=newList<Dictionary<string,object>>();
  7. if(list!=null){
  8. foreach(objectobjinlist){
  9. Dictionary<string,object>dic=newDictionary<string,object>();
  10. Typet=obj.GetType();
  11. foreach(PropertyInfopiint.GetProperties()){
  12. stringkey=pi.Name;
  13. objectvalue=pi.GetValue(obj,null);
  14. dic.Add(key,value);
  15. }
  16. rowsList.Add(dic);
  17. }
  18. }
  19. returnrowsList;
  20. }
  21. publicstringConvertToJson(){
  22. StringBuildersb=newStringBuilder();
  23. sb.AppendFormat("{{/"total/":{0},/"rows/":[",total);
  24. //添加数据
  25. if(rows!=null&&rows.Count>0){
  26. for(inti=0;i<rows.Count;i++){
  27. sb.Append("{");
  28. foreach(stringkeyinrows[i].Keys){
  29. if(rows[i][key]isValueType){
  30. sb.AppendFormat("/"{0}/":{1},",key,rows[i][key]);
  31. }else{
  32. sb.AppendFormat("/"{0}/":/"{1}/",",key,rows[i][key]);
  33. }
  34. }
  35. sb.Remove(sb.Length-1,1);
  36. sb.Append("}");
  37. if(i!=rows.Count-1){
  38. sb.Append(",");
  39. }
  40. }
  41. }
  42. sb.Append("],");
  43. sb.Append("/"columns/":[");
  44. //添加列
  45. if(columns!=null&&columns.Count>0){
  46. for(inti=0;i<columns.Count;i++){
  47. sb.Append(columns[i].ConvertToJson());
  48. if(i!=columns.Count-1){
  49. sb.Append(",");
  50. }
  51. }
  52. }
  53. sb.Append("]}");
  54. stringstr=sb.ToString();
  55. returnstr;
  56. }
  57. }
  58. publicclassJColumn{
  59. publicint?rowspan{get;set;}
  60. publicint?colspan{get;set;}
  61. publicbool?checkbox{get;set;}
  62. publicstringfield{get;set;}
  63. publicstringtitle{get;set;}
  64. publicintwidth{get;set;}
  65. publicstringalign{get;set;}
  66. publicstringConvertToJson(){
  67. StringBuildersb=newStringBuilder();
  68. sb.Append("{");
  69. if(rowspan!=null){
  70. sb.AppendFormat("/"rowspan/":{0},",rowspan);
  71. }
  72. if(colspan!=null){
  73. sb.AppendFormat("/"colspan/":{0},",colspan);
  74. }
  75. if(checkbox!=null){
  76. sb.AppendFormat("/"checkbox/":{0},",checkbox);
  77. }
  78. sb.AppendFormat("/"field/":/"{0}/",",field);
  79. sb.AppendFormat("/"width/":{0},",width);
  80. sb.AppendFormat("/"align/":/"{0}/",",align);
  81. sb.AppendFormat("/"title/":/"{0}/",",title);
  82. sb.Remove(sb.Length-1,1);
  83. sb.Append("}");
  84. stringstr=sb.ToString();
  85. returnstr;
  86. }
  87. }

3.后台获取数据(一般处理程序)

Code:
  1. publicvoidGetUserList2(HttpContextcontext){
  2. List<User>userList=newList<User>();
  3. for(inti=0;i<10;i++){
  4. userList.Add(newUser{
  5. Name="Name"+(i+1),
  6. Age=20+i,
  7. Gender=i%3==0?"男":"女",
  8. Hobby=i.ToString()
  9. });
  10. }
  11. List<JColumn>colList=newList<JColumn>(){
  12. newJColumn{field="Name",title="姓名",width=100,align="center"},
  13. newJColumn{field="Age",title="年龄",width=100,align="center"},
  14. newJColumn{field="Gender",title="性别",width=50,align="center"},
  15. newJColumn{field="Hobby",title="兴趣",width=150,align="center"},
  16. };
  17. JDataGriddg=newJDataGrid{
  18. total=20,
  19. rows=JDataGrid.ConvertRows(userList),
  20. columns=colList,
  21. };
  22. stringstrJson=dg.ConvertToJson();
  23. HttpResponseresponse=context.Response;
  24. response.ContentType="text/json";
  25. response.Write(strJson);
  26. }

对比前面的方法,显示代码通用多了。

演示下载

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值