层级树数据加载,
使用方式 递归加载数据 ,不限级,
数据来源 本地文件
涉及范围 文件读取,数据类型转换,数据绑定
效果图
数据格式: 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