ASP.NET DEMO 15: 如何编程动态创建 TreeView 的姊妹篇:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) {
            CreateMenu();
        }
    }

/// <summary>
    /// 创建 Menu
    /// 此方法采取一次性加载目标数据到 DataTable,递归查询 DataTable ,创建子节点
    /// </summary>
    private void CreateMenu()
    {
        //
        const int VirtualRootId = 0; // 虚拟的根节点 ID, 表中 ParentID=0 的节点表示无实际父节点
        const string SQL_SELECT = "SELECT NodeId, NodeName,ParentId FROM TreeView ORDER BY NodeId ASC";
        
        //
        string connStr = "Provider=Microsoft.Jet.OleDb.4.0;data source=" + Server.MapPath("Menu_CreateMenuDynamicFromDb.mdb"); ;        
        //
        OleDbDataAdapter da = new OleDbDataAdapter(SQL_SELECT, connStr);
        DataTable dt = new DataTable();
        //
        da.Fill(dt);
        //
        CreateMenuRecursive(mnuDemo.Items, dt, VirtualRootId);
    }

/// <summary>
    /// 递归查询数据,创建 MenuItem 节点
    /// </summary>
    /// <param name="items"></param>
    /// <param name="dataSource"></param>
    /// <param name="parentId"></param>
    private void CreateMenuRecursive(MenuItemCollection items, DataTable dataSource, int parentId)
    {
        //
        string fliter = String.Format("ParentId={0}", parentId);
        // 查询子节点
        DataRow[] drArr = dataSource.Select(fliter);
        
        MenuItem item;        
        foreach(DataRow dr in drArr) {                        
            //
            item = new MenuItem();
            items.Add(item);
            item.Text = (string)dr["NodeName"];            
            // 设置其他属性
            //      
                       
            // 递归创建子节点
            CreateMenuRecursive(item.ChildItems, dataSource, (int)dr["NodeId"]);
            
            // 移除已添加行,提高性能
            dataSource.Rows.Remove(dr);
        }
    }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>CreateMenuResursiveFromDb</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
   <h1>动态创建Menu</h1>
        <asp:Menu ID="mnuDemo" runat="server" ExpandDepth="1" BackColor="#FFFBD6" 
            DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" 
            ForeColor="#990000" StaticSubMenuIndent="10px">
            <StaticSelectedStyle BackColor="#FFCC66" />
            <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
            <DynamicHoverStyle BackColor="#990000" ForeColor="White" />
            <DynamicMenuStyle BackColor="#FFFBD6" />
            <DynamicSelectedStyle BackColor="#FFCC66" />
            <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
            <StaticHoverStyle BackColor="#990000" ForeColor="White" />
        </asp:Menu>
    </div>
    </form>
</body>
</html>

示例下载

ASP.NET DEMO 18: 如何编程动态创建 Menu相关推荐

  1. ASP.NET AJAX Advance Tips Tricks (11) 三种方法动态创建Tooltip

    前言 如何动态创建提示框(Tooltip)是ASP.NET Forum里的常见问题之一,在做技术支持时,我曾在英文博客上总结过ASP.NET和ASP.NET AJAX环境下如何动态创建提示框的三种常见 ...

  2. 动态生成word文档原来如此简单!Aspose.Words助力以Java编程方式创建丰富的Word文档

    近年来,Word文档的动态生成已成为组成报告,报价,发票和其他类型文档的流行功能.各种制造公司都基于数据库中存储的数据生成发票.在这种情况下,文档自动化可以节省手动文档创建过程中所需的时间,精力和资源 ...

  3. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性

    asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false;  // true 因为这样该容器及其子控件会彻底的从页面上消 ...

  4. 动态创建asp.net控件之我见

    最近考虑将之前用delphi设计的开发框架思路在asp.net上实现,其中有一项功能时动态生成录入界面,这在form开发程序中比较简单只要设置好动态生成的控件的所有者(owner),及位置还有相关事件 ...

  5. asp.net 动态创建TextBox控件 如何加载状态信息

    接着上文Asp.net TextBox的TextChanged事件你真的清楚吗? 这里我们来说说状态数据时如何加载的. 虽然在Control中有调用状态转存的方法,但是这里有一个判断条件 if (_c ...

  6. 风变编程第18关 编程思维_动态编程变得容易

    风变编程第18关 编程思维 Imagine you have a bag of coins where each coin is of value 5 dollars and you have to ...

  7. ASP.NET动态创建控件之绝境求生

    来源:中国IT实验室 在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Ide ...

  8. ASP.NET动态创建控件之绝境求生第一页

    ASP.NET动态创建控件之绝境求生 日期:2007年9月8日 作者: 查看:[ 大字体 中字体 小字体] <script src="../gg/info468.js" ty ...

  9. ASP.NET动态创建控件之绝境求生第二页

    ASP.NET动态创建控件之绝境求生 日期:2007年9月8日 作者: 查看:[大字体 中字体 小字体] <script src="../gg/info468.js" typ ...

最新文章

  1. Linux指令--文件和目录属性
  2. Scratch青少年编程能力等级测试模拟题(三级)
  3. 编程之美-数字哑谜和回文方法整理
  4. 43 FI配置-财务会计-固定资产-一般评估-定义折旧范围
  5. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
  6. CVPR 2022 | 即插即用!南洋理工商汤开源SAM-DETR: 利用语义对齐匹配实现快速收敛的DETR...
  7. 如何在微信中直接下载APK
  8. vs2013 打开失败 未能完成操作,不支持此接口
  9. IC设计之CDC(跨时钟域)问题
  10. Javascript中的作用域,作用域链
  11. 阿里巴巴年度技术总结 - 人工智能在搜索的应用和实践
  12. 三态门及其在I2C总线中的应用_普中_89C52单片机
  13. css 侧栏跟随_如何实现博客的侧栏跟随(滚动条)效果
  14. 编码的奥秘:从算盘到芯片
  15. DNP3 模拟器使用教程
  16. 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品 dreamweaver学生网站模板
  17. acm暑期集训_2020.07.02
  18. React——相关js库以及使用React开发者工具调试
  19. python中对列表的探讨(二)
  20. 人脸识别会被留底吗_人脸识别时代,我们的隐私会被刷走吗

热门文章

  1. springMvc整合hibernate出现问题
  2. RHCE 学习笔记(5)- 本地用户和组的管理
  3. 一.oracle的SQL中group by使用的情况(与聚合函数的关系)
  4. 使用POI导入导出Excel2003、2007示例
  5. XMPP系列2:如何掌握XMPP协议
  6. 如何将stdin、stdout、stderr重定向到/dev/null
  7. 2011年8月5日星期五
  8. C++ cin 详解之终极无惑
  9. python学习之字符串函数用法
  10. 数据库的相关语句(where,order by)