c#从数据库读取数据动态生成树形菜单

页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebTree.aspx.cs" Inherits="Tree.WebTree" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>树形菜单</title>
    <style>
        body
        {
            background: #ecefff;
        }
        .navPoint
        {
            color: #666;
            cursor: hand;
            font-family: Webdings;
            font-size: 9pt;
        }
        .NiuNiutree
        {
            width: 232px;
            height: 525px;
            overflow: auto;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TreeView ID="tvTree" runat="server" CssClass="NiuNiutree">
        </asp:TreeView>
    </div>
    </form>
</body>
</html>

页面后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NewsDAL;
using System.Data;

namespace Tree
{
    public partial class WebTree : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.tvTree.ShowLines = true;
                this.tvTree.ShowExpandCollapse = true;
                TreeNodeCollection tnc = new TreeNodeCollection();
                tnc = this.tvTree.Nodes;
                //0为根节点
                GetTree(tnc, 0);
            }
        }

public void GetTree(TreeNodeCollection tnc, int parentID)
        {
            string sql = string.Format("SELECT [treeID],[prentID],[name] FROM [Tree].[dbo].[Tree] where prentID=‘{0}‘", parentID);
            DataTable dt = DBHeper.GetDataSet(sql);
            foreach (DataRow dr in dt.Rows)
            {
                int treeid = Convert.ToInt32(dr["treeID"].ToString());
                int prentID = Convert.ToInt32(dr["prentID"].ToString());
                string name = Convert.ToString(dr["name"].ToString());
                TreeNode tn = new TreeNode();
                tn.Text = name;
                tn.NavigateUrl = "javascript:getBoundary(‘" + name + "‘)";//调用前台js方法  
                tn.ImageUrl = "images/file.png";//默认图标为file.png  
                tnc.Add(tn);

int tncInt = dt.Rows.IndexOf(dr);
                GetTree(tnc[tncInt].ChildNodes, treeid); //----------递归调用  
            }

if (dt.Rows.Count > 0)
            {
                tnc[0].Parent.ImageUrl = "images/openfoldericon.png";//设置父文件图标

}
            else
            {

tnc[0].Parent.ImageUrl = "images/file.png";
            }

}

}
}

DBHeper:类

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace NewsDAL
{
    
    public static  class DBHeper
    {
        
        private static SqlConnection connection;
        /// <summary>
        /// 连接数据库
        /// </summary><returns>返回 SqlConnection 对象</returns>
        public static SqlConnection Connection
        {
            get {
                string connectionstring=ConfigurationManager.ConnectionStrings["conn"].ConnectionString.ToString();
                if(connection==null)
                {
                    connection = new SqlConnection(connectionstring);
                    connection.Open();
                }
                else if (connection.State== System.Data.ConnectionState.Closed)
                {
                    connection.Open();
                }
                else if(connection.State==System.Data.ConnectionState.Broken)
                {
                    connection.Close();
                    connection.Open();
                }
                return DBHeper.connection;
                }  
        }

//关闭数据库连接的方法

public static void CloesConnection()
        {
            try {
                if(connection.State!=ConnectionState.Closed)
                {
                 connection.Close();
                }

}
            catch(Exception e){
                
            }
           
        }

/// <summary>
        /// 根据 SQL语句 查询所影响的行数
        /// </summary>
        /// <param name="sql"></param>
        /// <returns>返回 int 类型</returns>
        public static int ExecutCommand(string sql) {

try
            {
                SqlCommand cmd = new SqlCommand(sql,Connection);
                int result = cmd.ExecuteNonQuery();
                return result;

}catch(Exception e){
                return 0;
            }
        }

/// <summary>
        /// 根据 SQL语句、预编译数组 查询所影响的行数
        /// </summary>
        /// <param name="sql">参数 SQL 语句</param>
        /// <param name="values">参数 预编译数组</param>
        /// <returns>返回 int 类型</returns>

public static int ExecutCommand(string sql,params SqlParameter[] values) {
            try
            {
                SqlCommand cmd = new SqlCommand(sql,Connection);
                cmd.Parameters.Add(values);
                int result = cmd.ExecuteNonQuery();
                return result;

}
            catch (Exception e)
            {
                return 0;
            }
        
        }

/// <summary>
        /// 根据 SQL 语句查询得到的条数,执行查询,返回第一行第一列的值
        /// </summary>
        /// <param name="sql">参数 SQL 语句</param>
        /// <returns>返回 int 类型</returns>
        ///
        public static int GetScalar(string sql)
        {
            SqlCommand cmd = new SqlCommand(sql,Connection);
            int result = Convert.ToInt32(cmd.ExecuteScalar());
            return result;
        }

/// <summary>
        /// 根据 SQL语句、预编译数组 查询得到的条数,执行查询,返回第一行第一列的值
        /// </summary>
        /// <param name="sql">参数 SQL 语句</param>
        /// <param name="values">参数 预编译数组</param>
        /// <returns>返回 int 类型</returns>
        public static int GetScalar(string sql,params SqlParameter[] values)
        {
            SqlCommand cmd = new SqlCommand(sql,Connection);
            cmd.Parameters.AddRange(values);
            int result = Convert.ToInt32(cmd.ExecuteScalar());//cmd.ExecuteScalar()返回的是一个Ojbect类型的
            return result;
        }

/// <summary>
        /// 根据 SQL语句 查询数据
        /// </summary>
        /// <param name="sql">参数 接受一个 SQL语句</param>
        /// <returns>返回 DataTable 类型</returns>
        ///
        public static DataTable GetDataSet(string sql)
        {
            DataSet ds = new DataSet();
            SqlCommand cmd = new SqlCommand(sql,Connection);
            SqlDataAdapter sda =new SqlDataAdapter(cmd);//sqlDataAdapter用于填充DataSet
            sda.Fill(ds);//向DataTable中添加数据
            return ds.Tables[0];//获得表的集合

}

/// <summary>
        /// 根据 SQL语句、预编译数组 查询数据
        /// </summary>
        /// <param name="sql">参数 接受一个 SQL语句</param>
        /// <param name="values">参数 接受一个 预编译数组</param>
        /// <returns>返回 DataTable 类型</returns>
        ///

public static DataTable GetDataSet(string sql,params SqlParameter[] values) {

DataSet ds = new DataSet();
            SqlCommand cmd = new SqlCommand(sql,Connection);
            cmd.Parameters.AddRange(values);
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            sda.Fill(ds);
            return ds.Tables[0];
        }
    }

}

Web.config配置文件:

<?xml version="1.0"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <connectionStrings>
    <add name="conn" connectionString="server=.;user=sa;pwd=alog;database=Tree"/>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

<system.web>
    <compilation debug="true" targetFramework="4.0" />

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

<membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

<profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

<roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

</system.web>

<system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

数据库:

USE [Tree]
GO
/****** Object:  Table [dbo].[Tree]    Script Date: 07/30/2015 18:22:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N‘[dbo].[Tree]‘) AND type in (N‘U‘))
BEGIN
CREATE TABLE [dbo].[Tree](
    [treeID] [int] IDENTITY(1,1) NOT NULL,
    [prentID] [int] NOT NULL,
    [name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Tree_1] PRIMARY KEY CLUSTERED
(
    [treeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET IDENTITY_INSERT [dbo].[Tree] ON
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (1, 0, N‘广州市‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (3, 1, N‘天河区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (4, 1, N‘越秀区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (5, 1, N‘萝岗区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (6, 1, N‘黄浦区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (7, 1, N‘从化区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (8, 1, N‘海珠区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (9, 3, N‘车陂街道‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (10, 3, N‘棠下街道‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (11, 3, N‘石牌街道‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (12, 3, N‘天园街道‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (13, 9, N‘东圃社区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (14, 9, N‘明珠新村社区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (15, 9, N‘黄村社区‘)
INSERT [dbo].[Tree] ([treeID], [prentID], [name]) VALUES (16, 9, N‘前进社区‘)
SET IDENTITY_INSERT [dbo].[Tree] OFF

时间: 2024-11-08 22:23:52

c#从数据库读取数据动态生成树形菜单的相关文章

Cglib根据数据库表数据动态生成对象

最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import java.util import net.sf.cglib.beans.{BeanGenerator, BeanMap} /** * 动态Bean生成 * * @author BarryWang create at 2018/6/19 11:54 * @version 0.0.1 */class Dyna

生成树形菜单

题记------学习别人的精髓,并加以总结,消化吸收,这就是提高!!! 动态生成树形菜单,前台用easyui实现,非常简单不赘述,主要给出后台java的逻辑代码 1 package com.gongli.util.entity.treeMenu; 2 3 4 5 /* 6 * 用于封装树形菜单,无具体表与之对应,根节点为-1,节点0,然后父节点0,节点001,父节点001,节点001001,001002,001...依次类推 7 */ 8 public class TreeMenu { 9 pr

用C#从数据库动态生成AdminLTE菜单的一种方法

用C#从数据库动态生成AdminLTE菜单的一种方法 当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate.首先看一下主界面: 查看左边导航的菜单html结构(下面代码有错误,HTML自定义属性直接用空格进行分割,而不是,号进行分割,不然jquery获取定义属性

C++ 从数据库读取数据,将数据显示在界面上的TreeCtrl上

oracle数据库读取数据如下所示: 代码如下: //构造节点 struct AREA { long id; long parent_area_id; string area_name; std::vector<AREA> children; } //从AREA表中根据id读一个结构体Area的数据 void Id2FindAreaTree(Session ses, AREA& Area, int id) { Statement select(ses); select <<

jquery.datatable插件从数据库读取数据

一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: "sEcho":这个属性需要原封不动地传回给datatable,具体的作用我也不清楚,但是根据它值的变化情况来看,好像是一个操作次数的计数(之前我一直把它当做是pageindex来用,结果发现,不论我在datatable中是翻下一页还是翻上一页,它一直在增加.) "iDisplayStart&q

echarts通过ajax向服务器发送post请求,servlet从数据库读取数据并返回前端

1.echarts的官网上的demo,都是直接写死的随机数据,没有和数据库的交互,所以就自己写了一下,ok,我们开始一步一步走一遍整个流程吧. 就以官网最简单的那个小demo来做修改吧.官网上的小demo的效果图如下:(很熟悉,有没有) 2.按照echarts的使用方法新建一个echarts.html文件.为ECharts准备一个具备大小(宽高)的Dom(讲的有点细,熟悉的朋友直接跳过) <!DOCTYPE html> <head> <meta charset="u

10天学会phpWeChat——第三天:从数据库读取数据到视图

在第二天,我们创建了我们的第一个phpWeChat功能模块,但是比较简单.实际生产环境中,我们不可能有如此简单的需求.更多的情况是数据存储在MySql数据库中,我们开发功能模块的作用就是将这些数据从MySql读取并通过视图多样化的呈现给用户. 今天我们进入<10天学会phpWeChat>系列教程的第三天:从数据库读取数据到视图. 一.首先,我们创建一个MySql数据文章表(pw_wechat_hello_article)用来存储要显示给用户的数据. 为了简单明了,这个表我们只保留3个字段: I

C#实现从数据库读取数据到Excel

用第三方组件:NPOI来实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写. 创建一个实体类: [Table("Customer") ] public class Customer { [Key] public int Id { get; set; } public st

动态生成多级菜单

MVC5+EF6 入门完整教程13 -- 动态生成多级菜单 稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据model动态产生. 文章提纲 概述要点 && 理论基础 详细步骤 一.分析多级目录的html结构 二.根据html结构构建data model 三.根据data model动态生成树形结构 四.解析树形结构成html 总结 概述要点 &am