tree虽然不难,但还是比较麻烦的。
后台比较差的我,为了练手。
今天花了一下午的时间。写了一套转tree的方法。
现在总结一下代码,顺便分享给大家。希望高手指点
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Horizon.Common;
using System.Text;
using Horizon.Model;
namespace Horizon.Models
{
public static class TreeHelper
{
/// <summary>将DataTable转为Tree的JSON类型
/// </summary>
/// <typeparam name="T">表对象类型,用于attributes字段序列化</typeparam>
/// <param name="dt">要转换的DataTable</param>
/// <param name="id">指定标识字段</param>
/// <param name="text">指定文本字段</param>
/// <param name="_parentId">指定关系字段</param>
/// <param name="iconCls">指定图标字段</param>
/// <returns></returns>
public static string ToTreeJSON<T>(this DataTable dt, string id, string text, string _parentId, string iconCls = "")
{
List<Tree<T>> _treeList = GetTree<T>(dt, id, text, _parentId, iconCls);
var list = TreeFromat<T>(_treeList);
return list.ToJSON();
}
private static List<Tree<T>> GetTree<T>(DataTable dt, string id, string text, string _parentId, string iconCls = "")
{
List<Tree<T>> _treeList = new List<Tree<T>>();
foreach (DataRow dr in dt.Rows)
{
Tree<T> _tree = new Tree<T>();
_tree.id = Convert.ToInt32(dr[id]);
_tree.text = Convert.ToString(dr[text]);
_tree._parentId = Convert.ToInt32(dr[_parentId]);
_tree.attributes = dr.ToModel<T>();
_treeList.Add(_tree);
}
return _treeList;
}
private static List<Tree<T>> TreeFromat<T>(List<Tree<T>> _treeList, int _parentId = 0)
{
var _list = _treeList.Where<Tree<T>>(p => p._parentId == _parentId).ToList();
foreach (Tree<T> item in _list)
{
_treeList.Remove(item);
item.children = TreeFromat(_treeList, item.id);
//递归
}
return _list;
}
}
public class Tree<T>
{
public int id { get; set; }
public string text { get; set; }
public int _parentId { get; set; }
public string iconCls { get; set; }
public T attributes { get; set; }
public List<Tree<T>> children { get; set; }
}
}
调用:
public string GetMenu()
{
return sql.GetDataTable("sys_menu").ToTreeJSON<sys_menu>("id", "menu_name", "parent_id");
}