Bootstrap TreeView使用教程一:树的构造和显示

很多时候我们需要在网页上显示存在层级隶属关系的数据,例如省、市、区这三者就存在隶属关系,如果要对它们进行显示就需要用到树控件。百度了很久,发现同志们经常用的有zTree、jsTree等等,但考虑到工作中的前端库是Bootstrap,为了使界面风格能够相对统一,我还是决定使用Bootstrap TreeView来做。它的下载很简单,NuGet一搜就有,如下图:
在这里插入图片描述

数据准备

我在这里建了一张数据表, 其中的测试数据如下图所示:
在这里插入图片描述

前端代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Bootstrap TreeView</title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="Content/bootstrap-treeview.min.css" rel="stylesheet" />
    <script src="Scripts/jquery-2.1.4.min.js"></script>
    <script src="Scripts/bootstrap.min.js"></script>
    <script src="Scripts/bootstrap-treeview.min.js"></script>
</head>
<body>
    <div id="tv" style="width:300px;border:1px solid #E8E8E8;margin-left:200px;margin-top:50px;"></div>
    <script>
        $(document).ready(function () {
            var nodeData = [];

            // 获取后台数据
            $.ajax({
                url: 'Handlers/GetTreeNodesHandler.ashx',
                type: 'post',
                dataType: 'json',
                async: false,
                success: function (data) {
                    nodeData = data;
                }
            })

            // 初始化TreeView
            $('#tv').treeview({
                data: nodeData,
                showCheckbox: true,
                showBorder: false,
                selectedBackColor: 'skyblue',
                selectedColor: 'white',
                onNodeSelected: function (event, node) {
                    alert(node.text);
                },
                onNodeChecked: function (event, node) {
                    
                },
                onNodeUnchecked: function (event, node) {
                    
                }
            })
        })
    </script>
</body>
</html>

后台代码

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using Newtonsoft.Json;

namespace WebApplication2.Handlers
{
    /// <summary>
    /// GetTreeNodesHandler 的摘要说明
    /// </summary>
    public class GetTreeNodesHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            // 查询数据
            DataTable dataTable = new DataTable();
            string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
            using (SqlDataAdapter adapter = new SqlDataAdapter("select * from [TRegion]", connectionString))
            {
                adapter.Fill(dataTable);
            }

            // 转换为实体类
            List<Node> nodes = new List<Node>();
            foreach (DataRow row in dataTable.Rows)
            {
                Node node = new Node();
                node.id = Convert.ToInt32(row["id"].ToString());
                node.pid = Convert.ToInt32(row["pid"].ToString());
                node.text = row["text"].ToString();
                nodes.Add(node);
            }

            // 转换为JSON树
            List<Node> list = CreateTreeNodes(nodes);
            context.Response.Write(JsonConvert.SerializeObject(list).Replace("[]", "null"));
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        // 生成树
        private List<Node> CreateTreeNodes(List<Node> nodes)
        {
            List<Node> root = nodes.FindAll(node => node.pid == 0);
            return SortNodes(nodes, root);
        }

        // 递归分组
        private List<Node> SortNodes(List<Node> nodes, List<Node> root)
        {
            for (int i = 0; i < root.Count; i++)
            {
                List<Node> children = nodes.FindAll(node => node.pid == root[i].id);
                SortNodes(nodes, children);
                root[i].nodes = children;
            }
            return root;
        }
    }

    public class Node
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// 上一级编号
        /// </summary>
        public int pid { get; set; }

        /// <summary>
        /// 名称
        /// </summary>
        public string text { get; set; }

        /// <summary>
        /// 子节点
        /// </summary>
        public List<Node> nodes;
    }
}

界面效果

在这里插入图片描述
到此为止,我们已经能够使用Bootstrap TreeView显示省、市、区的关系了~不过细心的同志应该会发现:每个节点左侧都有一个复选框,但选择复选框后并没有实现想象中的多级联动效果。关于树控件多级联动效果的实现方法,我会在下一篇博客中进行介绍。

发布了99 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/HerryDong/article/details/104645325