层级树数据加载,
使用方式 递归加载数据 ,不限级,
数据来源 本地文件
涉及范围 文件读取,数据类型转换,数据绑定
效果图
数据格式: 0是一级目录,箭头表示层级关联关系 数据文件存放在 运行程序根目录 下 的Data目录下
数据源 文件名'data.txt' 存放在exe程序目录下的Data目录下
s3a1-h1jw-42e4-2ksa-243-fw4,张三,0 s3a1-h1jw-42e4-2ksa-243-fw42,张三2,s3a1-h1jw-42e4-2ksa-243-fw4 s3a1-h1jw-42e4-2ksa-2wz43-fw42,张三3,s3a1-h1jw-42e4-2ksa-243-fw42 s3a1-h1jw-42e4-2ksa-2wdz43-fw42,张三4,s3a1-h1jw-42e4-2ksa-2wz43-fw42 s3a1-h1jw-42e4-2ksa-243-fw42,张三1,0 s3a1-h1jw-42e4-2ksa-243-fw4sf2,张三1,s3a1-h1jw-42e4-2ksa-243-fw42 s3a1-h1jw-42e4-2ksa-243-fw43,张三2,0 s3a1-h1jw-42e4-2ksa-243-fw44,张三3,0 s3a1-h1jw-42e4-2k3sa-243-fw54,张三4,0 s3a1-h1jw-42e4-2k5sa-243-fw4,张三5,0 s3a1-h1jw-42e4-24ksa-243-fw4,张三6,0 s3a1-h1jw-42e4-2kdsa-243-fw4,张三77,0 s3a1-h1jw-42e4-2ksdda-243-fw4,张三4,0 s3a1-h1jw-42e4-2kdsa-s243-fw4,张三34,0 s3a1-h1jw-42e4-2kfsa-243-fw4,张5三,0 s3a1-h1jw-42e4-2ksa-2a43-fw4,张三24,0 s3a1-h1jw-42e4-2bksa-243-fw4,张54三,0 s3a1-h1jw-42e4-2ksvca-243-fw4,张55三,0
文件读取类 FileTools.cs
using System; using System.Data; using System.IO; using System.Text; using System.Windows.Forms; using DevexpressExtendUnits; namespace 权限树.Tools { /// <summary> /// 描述 文件读写 /// </summary> public class FileTools { public static string FilePath = @"\Datas\Datas.txt"; /// <summary> /// 读取文件呢 /// </summary> /// <returns></returns> public static string[] Get() { var filePath = Application.StartupPath + @FilePath; if (FileIsExists(filePath) == false) { return null; } try { return File.ReadAllLines(filePath, Encoding.UTF8); } catch (Exception ex) { return null; } } public static void AppendText(string text) { var filePath = Application.StartupPath + @FilePath; if (FileIsExists(filePath) == false) { return; } var fs = new FileStream(filePath, FileMode.Open); var sw = new StreamWriter(fs, Encoding.UTF8); //开始写入 sw.WriteLine(text); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); } /// <summary> /// 判断文件是否存在 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static bool FileIsExists(string filePath) { if (File.Exists(filePath)) return true; MessageBox.Show(filePath + "\n文件丢失"); return false; } /// <summary> /// string 数组转DataTable /// </summary> /// <returns></returns> public static DataTable ParamToDataTable(string[] str,string split=",") { if (str.Length <= 0) { return null; } DataTable dt=new DataTable(); for (var j = 0; j < str.Length; j++) { var st = str[j].Split(','); for (var i = 0; i < st.Length; i++) { if (j == 0) {//添加列 dt.Columns.Add("column"+i,Type.GetType("System.String")); } if (i == 0) { dt.Rows.Add(); } dt.Rows[j][i] = st[i]; } } return dt; } } }
层级树窗口 Home
窗口控件有: Button 按钮
目的:点击加载数据
Treeview
目的:显示数据
代码
using System; using System.Data; using System.Windows.Forms; using 权限树.Tools; namespace 权限树 { public partial class Home : Form { public Home() { InitializeComponent(); } //读取文件数据 private void button1_Click(object sender, EventArgs e) { var jsons = FileTools.Get(); var dt = FileTools.ParamToDataTable(jsons); var first = dt.Select("column2='0'"); AddNodes(treeView1.Nodes, dt, "0", "column2", 0); } /// <summary> /// 添加节点 /// </summary> /// <param name="nodes">Nodes对象</param> /// <param name="dt">数据源</param> /// <param name="parentId">关联ID</param> /// <param name="parentName">关联查询列的名称</param> /// <param name="parentIndex">关联值得下标</param> /// <param name="keyIndex">绑定数据 key的下标</param> /// <param name="valueIndex">绑定数据 value 的下标</param> public void AddNodes(TreeNodeCollection nodes, DataTable dt, string parentId, string parentName, int parentIndex, int keyIndex = 0, int valueIndex = 1) { var first = dt.Select(parentName + "='" + parentId + "'"); if (first.Length <= 0) { return; } for (var i = 0; i < first.Length; i++) { var firstRow = first[i]; nodes.Add(firstRow[keyIndex].ToString(), firstRow[valueIndex].ToString(), ""); var parentIds = firstRow[parentIndex].ToString(); var node = nodes[i].Nodes; AddNodes(node, dt, parentIds, parentName, parentIndex); } } /// <summary> /// 添加节点 /// </summary> /// <param name="nodes">Nodes对象</param> /// <param name="dt">数据源</param> /// <param name="parentId">关联ID</param> /// <param name="parentName">关联查询列的名称</param> /// <param name="parentIndexName">关联值得下标列名称</param> /// <param name="keyIndexName">绑定数据 key的下标名称</param> /// <param name="valueIndexName">绑定数据 value 的下标名称</param> public void AddNodes(TreeNodeCollection nodes, DataTable dt, string parentId, string parentName, string parentIndexName, string keyIndexName = "column0", string valueIndexName = "column1") { var first = dt.Select(parentName + "='" + parentId + "'"); if (first.Length <= 0) { return; } for (var i = 0; i < first.Length; i++) { var firstRow = first[i]; nodes.Add(firstRow[keyIndexName].ToString(), firstRow[valueIndexName].ToString(), ""); var parentIds = firstRow[parentIndexName].ToString(); var node = nodes[i].Nodes; AddNodes(node, dt, parentIds, parentName, parentIndexName); } } } }有没有觉着,两个方法的参数太多,当然最初的样子只有 3个参数, 后面为了改成工具 方法,添加了许多参数,如果实在觉得参数太多,一下是参数少的方法
少参数方法代码 Home.cs 清楚参数关系
using System; using System.Data; using System.Windows.Forms; using 权限树.Tools; namespace 权限树 { public partial class Home : Form { public Home() { InitializeComponent(); } //读取文件数据 private void button1_Click(object sender, EventArgs e) { var jsons = FileTools.Get(); var dt = FileTools.ParamToDataTable(jsons); var first = dt.Select("column2='0'"); AddNodes(treeView1.Nodes, dt, "0"); } /// <summary> /// 添加节点 /// </summary> /// <param name="nodes">Nodes对象</param> /// <param name="dt">数据源</param> /// <param name="parentId">关联ID</param> public void AddNodes(TreeNodeCollection nodes, DataTable dt, string parentId) { var first = dt.Select("column2='" + parentId + "'"); if (first.Length <= 0) { return; } for (var i = 0; i < first.Length; i++) { var firstRow = first[i]; nodes.Add(firstRow[0].ToString(), firstRow[1].ToString(), ""); var parentIds = firstRow[0].ToString(); var node = nodes[i].Nodes; AddNodes(node, dt, parentIds); } } } }
实例代码 点击打开链接 http://download.csdn.net/download/qq_28254093/10038088