在做系统的时候,有一些组织机构类的关系,成树状结构,前台用的是EasyUI,由于涉及到多张表的数据,想要动态的拼接出一个树状的组织结构,后台传过来的是DataTable。
/// <summary>
/// DataTable转EasyUiTree的Json格式
/// </summary>
/// <param name="dt">要转化的表</param>
/// <param name="pField">父节点对应字段</param>
/// <param name="pValue">父节点的值,默认为"0"</param>
/// <param name="idField">ID对应的字段</param>
/// <param name="nameField">Name对应的字段</param>
/// <param name="isParentField">是否是父节点对应的字段</param>
/// <param name="isChooseParentNode">是否选择父节点,有单选框、复选框的时候用;true:checkbox radio 可以选择父节点/子节点;false:radio 只能选择叶子节点</param>
/// <returns></returns>
public static string DataTableToJsonElecViewTree(DataTable dt)
{
StringBuilder sb = new StringBuilder();
string filter = string.Format("{0}='{1}'", "system_id", 0); //获取顶级目录
DataRow[] drs = dt.Select(filter);
if (drs.Length < 1 )
{
return "";
}
sb.Append("[");
//拼接显示到前台
foreach (DataRow item in drs)
{
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", item["system_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", item["system_name"].ToString());
//获取children节点数据
string filterDoor = string.Format("{0}='{1}'", "system_id", 2);
DataRow[] drDoor = dt.Select(filterDoor);
string systemid = drDoor[0]["system_id"].ToString();
DoorGuardSystemBLL doorGuardSystemBLL = new DoorGuardSystemBLL();
DataTable dtDoor = doorGuardSystemBLL.GetSystemDomain(int.Parse(systemid));
//拼接到父节点下
if (dtDoor.Rows.Count < 1)
{
return "";
}
else
{
sb.Append(",\"children\":[");
foreach (DataRow itemSon in dtDoor.Rows)
{
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", itemSon["domain_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", itemSon["domain_name"].ToString());
sb.Append("},");
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
}
sb.Append("},");
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
return sb.ToString();
}
拼接Tree的时候,一定要注意一些标点的东西,错了的话他也不会给提示,但也不显示数据,考验细心的地方。
刚开始拼的时候,一点头绪都没有,在网上搜的赶脚有点复杂,看不懂,然后自己就一级一级的往下拼,虽然说现在的循环有点多,而且这只是两层的结构,但是自己摸索出来的东西就是有成就感,以后再优化,先这么用着。大家也可以试试!
时间: 2024-11-02 13:26:29