在网上淘了很久自己研究了半天的时间终于做出来了,有很多不足之处,欢迎大家提意见,这里面用到了Prism.Mvvm,也可使用c# System.ComponentModel类库中的 INotifyPropertyChanged来替代,有需要的可以去自行下载

Html页面代码

这里很简单,绑定了后台的几个属性,
TreeView 的ItemsSource绑定到TreeNode后台和TreeView交互的属性
ChildNodes:节点
NodeName:节点名称

<TreeView Name="chapterTree" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding TreeNode}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}">
                        <StackPanel>
                            <Label Content="{Binding Path=NodeName}"/>
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

后台代码

  1. 首先新建一个TreeNode类保存节点属性,定义如下所示:
public class TreeNode {
        public int NodeID { get; set; }
        public int ParentID { get; set; }
        public string NodeName { get; set; }
        public List<TreeNode> ChildNodes { get; set; }
        public TreeNode() {
            ChildNodes = new List<TreeNode>();
        }
    }
  1. 获取数据库数据源
    List treeFile:放入生成节点的字段
    DataTable treeDataTable :数据源
    这里注意treeFile的内容必须包含在treeDataTable 内
/// <summary>
        /// 获取绑定源
        /// </summary>
        /// <param name="treeFile">绑定的字段</param>
        /// <param name="treeDataTable">绑定的数据来源</param>
        private List<TreeNode> InPutTreeNode(List<string> treeFile ,DataTable treeDataTable) {
            bool isOk;
            //转中文,因为数据库中是英文的字段所以封装了一个中英文转换类,没有转换的可以不要这段FOR循环
            for (int i = 0; i < treeFile.Count; i++) {
                treeFile[i] = Common.UtoC(sqlForm, treeFile[i], out isOk);
            }

            //检查数据源是否包含字段
            for (int i = 0; i < treeFile.Count; i++) {
                if (treeDataTable.Columns.Contains(treeFile[i])) {
                    continue;
                } else {
                    Common.SetErrmsg = "error_数据_树结构绑定错误,不存在的字段";
                    return null;
                }
            }

            int id = 1;
            List<TreeNode> allTree = new List<TreeNode>();
            foreach (DataRow row in treeDataTable.Rows) {
                bool haveNull = true;
                //检查是否存在空值
                for (int i = 0; i < treeFile.Count; i++) {
                    if (string.IsNullOrWhiteSpace(row[treeFile[i]].ToString())) {
                        haveNull = true;
                        break;
                    }
                }
                if (haveNull) continue;
                for (int i = 0; i < treeFile.Count; i++) {
                    TreeNode treeNodes = new TreeNode();

                    var dd = from tr in allTree
                             where tr.ParentID == i
                             where tr.NodeName == row[treeFile[i]].ToString()
                             select tr.ParentID;
                    var ds = dd.ToList();

                    if (ds.Count <= 0) {
                        if (i!=0) {
                            //获取索引
                            var dd2 = from tr in allTree
                                          //where tr.ParentID == i - 1
                                      where tr.NodeName == row[treeFile[i - 1]].ToString()
                                      select tr.ParentID;
                            var s1 = dd2.ToList();
                            //获取id
                            var dd1 = from tr in allTree
                                      where tr.ParentID == s1[0]
                                      where tr.NodeName == row[treeFile[i-1]].ToString()
                                     select tr.NodeID;
                            var s =  dd1.ToList();
                            //检查是否存在
                            var dd3 = from tr in allTree
                                      where tr.ParentID == s[0]
                                      where tr.NodeName == row[treeFile[i]].ToString()
                                      select tr.NodeID;
                            var s2 = dd3.ToList();

                            if (s2.Count>0) {
                                continue;
                            }

                            treeNodes.ParentID = s[0];
                            treeNodes.NodeID = id;
                            treeNodes.NodeName = row[treeFile[i]].ToString();
                            allTree.Add(treeNodes);
                            id++;
                            continue;
                        }
                        treeNodes.ParentID = i;
                        treeNodes.NodeID = id;
                        treeNodes.NodeName = row[treeFile[i]].ToString();
                        allTree.Add(treeNodes);
                        id++;
                    }
                }
            }
            return allTree;
        }

获取生成TreeView的数据

直接搬网上的了

private List<TreeNode> getNodes(int parentID, List<TreeNode> nodes) {
            if (nodes==null) {
                return null;
            }
            List<TreeNode> mainNodes = nodes.Where(x => x.ParentID == parentID).ToList();
            List<TreeNode> otherNodes = nodes.Where(x => x.ParentID != parentID).ToList();
            foreach (TreeNode node in mainNodes)
                node.ChildNodes = getNodes(node.NodeID, otherNodes);
            return mainNodes;
        }

MVVM绑定属性,由于数据量有点大这里我起了一个线程来生成树结构

//树结构绑定数据
        private List<TreeNode> treeNode;//树结构显示数据
        public List<TreeNode> TreeNode {
            get {
                Thread thread = new Thread(threadOne);
                thread.Start();
                return treeNode;
            }
            set {
                treeNode = value;
                this.OnPropertyChanged("TreeNode");
            }
        }

线程调用的方法

 private void threadOne() {
            List<string> vs = new List<string> { "WeiHuBanZu", "SuoShuXianLu", "Name" };
            TreeNode = getNodes(0, InPutTreeNode(vs, dataTable));
        }

效果

在这里插入图片描述

部分内容转自这里,大家如果看不明白可以看下

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐