EasyUI tree读取sql server的表结构得到json格式
本来项目需要一个tree的树结构,后来随便选择了一个easyUI tree开源框架,后来碰到一个问题,我是要从数据库递归出结构的,转成json的,怎么做?难道是递归了拼接StringBuilder?要是这样做就太傻了,当时也打算这么做。然后各种百度,博客园,QQ群去问,回答的也是五花八门,没人给我指点详细的,我只好自己琢磨了。
第一:递归数据库的表。
第二:序列化最后的递归结果。
这里是我的数据库的表:
然后下面是代码:
这里需要建立一个实体类,类的属性跟数据库表的一样,只是多了一个泛型属性,是为了保存子对象,你想看,要是这个类的属性有:ID,Name,ParentID(数据库的字段一样)你怎么递归得到父子的关系的tree?所以就多一个字段,这个字段就是泛型,例如我下面声明的类叫:Tree,所以我的类里有4个属性:ID,Name,ParentID,item,因为在easyUI tree里面,它的json结构是这样的:
[{ "id":"1" , "text":"文件夹" , "status":"open" , "children":
[{ "id":"1" , "text":"文件夹" , "status":"open" , "children":null }]
}]
所以多这个List<Tree>就是保存一个一模一样的子对象,这里我声明item为保存子对象。
1 public class Tree 2 { 3 public int ID; 4 public string Name; 5 public int ParentID; 6 public List<Tree> item; 7 }
这里就是我写的递归方法:
1 /// <summary> 2 /// 用于遍历数据库表中保存上下级关系的tree结构 3 /// </summary> 4 /// <param name="ParentID">父级ID</param> 5 /// <param name="li">list对象</param> 6 /// <returns></returns> 7 protected List<Tree> Recursive(int ParentID,List<Tree> li) 8 { 9 DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID); 10 if (ds_content.Tables[0].Rows.Count > 0)//判断如果查询到的结果不为空,才去递归 11 { 12 //DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID);//根据父id查询有没有子id 13 for (int i = 0; i < ds_content.Tables[0].Rows.Count; i++) 14 { 15 List<Tree> lis = new List<Tree>();//声明一个泛型用于保存子对象,Tree是我自己建立的一个类, 16 Tree t = new Tree(); 17 t.ID = int.Parse(ds_content.Tables[0].Rows[i][0].ToString()); 18 t.Name = ds_content.Tables[0].Rows[i][1].ToString(); 19 t.ParentID=int.Parse(ds_content.Tables[0].Rows[i][2].ToString()); 20 DataSet ds_HaveItem = Sql.GetDaTa("SELECT id FROM tb_cm WHERE parentID="+t.ID);//查询用于判断是否有子对象 21 //三元运算符判断大于0代表有子对象,有就返回遍历,否则返回null 22 t.item = ds_HaveItem.Tables[0].Rows.Count > 0 ? Recursive(t.ID, lis) : null; 23 24 li.Add(t); 25 } 26 } 27 return li; 28 }
这里就是序列化,序列化就变成json格式,所以不需要sb.append("[{")这样的去拼接字符串:
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 GridView1.DataSource = Sql.GetDaTa("select * from tb_cm"); 4 GridView1.DataBind(); 5 6 List<Tree> li = new List<Tree>(); 7 Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Recursive(0, li))); 8 }
这个Newtonsoft.Json.JsonConvert.SerializeObject()序列化是我去csdn看别人回答的时候提到这个,这个是别人封装了的东西,从github下载来的,下载好了放到项目里,在项目里的引用那里点击【添加引用】,然后选择【浏览】找到你的项目里的这个dll,然后就成这样了:
下面这个Sql是我自己建立的类,里面返回查询结果,你可以自己写吧,记得在这个类的最上面引用的地方输入:using System.Configuration;
1 public class Sql 2 { 3 static string connstr = ConfigurationManager.ConnectionStrings["connStr"].ToString(); 4 5 static SqlConnection conn = new SqlConnection(connstr); 6 7 public static DataSet GetDaTa(string sql) 8 { 9 DataSet ds = new DataSet(); 10 SqlDataAdapter sda = new SqlDataAdapter(sql, conn); 11 sda.Fill(ds); 12 13 return ds; 14 } 15 16 }
配置文件:
然后就运行吧:
已经输出json格式的内容了,把它赋值到json在线编辑器看看如何?
嗯,一切正常,我就不做前台的了,你用的话自己在前台ajax请求到后台返回这个结果就行了。睡觉了,一下还要上班。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。