WinForm 递归生成部门树

利用 ADO.NET 从数据库获取部门数据,然后按深度优先依次生成部门树结构。

//窗体加载事件
private void Form_Load(object sender, EventArgs e)
{
    TreeNode root;

    //先设置根节点为起始位置
    root = treeView1.Nodes[0];
//然后获取所有的节点数据,并缓存,方便后面筛选子节点 DataSet ds = SQLHelper.Query(SQLHelper._connstr, "SELECT deptId,parentId,deptCode,deptName,level FROM Department"); List<DeptDto> all = ExtensionMethod.ConvertToModel<DeptDto>(ds.Tables[0]);
//递归生成树 LoadTreeRecursive(all, root, "0"); treeView1.ExpandAll(); } //递归生成树结构 private void LoadTreeRecursive(List<TypeDetail> dataList, TreeNode curNode, string curId) { List<DeptDto> children = dataList.Where(d => d.fore_id.Trim() == curId).ToList(); foreach (TypeDetail type in children) //当children为空时会自动停止执行 { TreeNode node; node = new TreeNode(type.type_name); node.ImageIndex = 1; node.SelectedImageIndex = 1; node.Tag = type;
//按深度优先,逐层添加子节点 curNode.Nodes.Add(node); //搜索下一层 LoadTreeRecursive(dataList, node, ((TypeDetail)node.Tag).type_id); } } //DataTable 转 List<T> 的扩展方法 public static List<T> ConvertToModel<T>(this DataTable table) where T : new() { var list = new List<T>(); PropertyInfo[] propertys = typeof(T).GetProperties(); foreach (DataRow row in table.Rows) { T model = Activator.CreateInstance<T>(); foreach (PropertyInfo pi in propertys) { var tempName = pi.Name; if (!table.Columns.Contains(tempName)) continue; if (!pi.CanWrite) continue; object value = Convert.ToString(row[tempName]); if (value != DBNull.Value) { pi.SetValue(model, value, null); } } list.Add(model); } return list; } //表结构对应的实体类 public class DeptDto { public string deptId { get; set; } public string parentId { get; set; } public string deptCode { get; set; } public string deptName { get; set; } public string level { get; set; } }

猜你喜欢

转载自www.cnblogs.com/hellowzl/p/10273694.html