网站导航(TreeView 控件)

news/2024/5/10 2:10:01/文章来源:https://blog.csdn.net/weixin_34062329/article/details/86181939

       TreeView 是让人印象最深刻的导航控件之一,不仅因为它允许呈现富树视图,还因为它支持按需填入树的部分(不需要刷新整个页面)。但最重要的是,它支持很多样式来改变它的外观。

       通过几个基本的属性,可以把 TreeView 从一个帮助主题索引变成一个文件或文件夹目录列表。实际上,TreeView 根本不必呈现为一棵树,通过一点点样式设置,它可以呈现非缩进层次的数据,比如应用程序目录表。

       可以使用 TreeView 显示绑定的 XML 数据,显示站点地图数据,这是它绑定层次化数据源的能力。但还可以绑定一个普通的数据源来填充 TreeView(只会得到第一层节点),你还可以自己创造节点,通过编程或在 .aspx 页面声明。

<asp:TreeView ID="TreeView1" runat="server">
    <Nodes>
        <asp:TreeNode Text="Products">
            <asp:TreeNode Text="Hardware"></asp:TreeNode>
        </asp:TreeNode>
        <asp:TreeNode Text="Services"></asp:TreeNode>
    </Nodes>
</asp:TreeView>

 

       TreeView 第一次显示时所有的节点都会出现。设置 TreeView.ExpandDepth 属性来控制这一行为。如果 ExpandDepth = 2,则只有0,1,2 这三层被显示。

       MaxDataBindDepth 属性可以控制 TreeView 总共包含多少层(展开的或折叠的),MaxDataBindDepth 默认 -1,你可以查看整棵树。如果是 2,你只能看到起始节点下的 2 层。

       通过编程设置 TreeNode.Expanded 属性来打开或折叠节点。

 

 

TreeNode

       TreeNode 对象表示树的每一个节点。TreeNode 提供了导航属性,如 ChildNodes 和 Parent,除了这些基本属性外,还提供了下表的所有实用属性:

Text节点显示的文字
ToolTip鼠标停留节点文本上显示提示文字
Value保存关于节点的不显示的额外数据(比如单击事件用于识别节点或查找更多信息的唯一 ID)
NavigateUrl如果设置了值,单击后会前进至此 URL。
否则,需要响应 TreeView.SelectedNodeChanged 事件以便确定要执行的活动。
Target如果设置了 NavigateUrl 属性,它会设置链接的目标窗口或框架。如果没有设置 Target,新页面在当前窗口打开。TreeView 控件本身也暴露了 Target 属性用来设置所有节点的默认目标
ImageUrl显示在节点旁边的图片
ImageToolTip该图片的提示信息

 

        TreeNode 有一个不寻常的细节是,它有两个模式:

  • 选择模式单击节点会回发页面并引发 TreeView.SelectedNodeChanged 事件。(这是所有节点的默认模式)
  • 导航模式单击后导航到新页面,不会触发上述事件。只要 NavigateUrl 属性非空,TreeNode 就会处于导航模式

注:

       绑定到站点地图的 TreeNode 处于导航模式,因为每个站点地图节点提供一个 URL 信息。

 

       下面这个示例用数据库查询结果填充 TreeView,利用 TreeView 能够显示层次化数据的能力创建一个主从表。ASP.NET 没有提供任何查询数据库并按层次化显示结果的数据源控件,所有不能进行数据绑定,必须通过编程来查询表手工创建 TreeNode 结构:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        DataSet ds = GetProductsAndCategories();
 
        foreach (DataRow row in ds.Tables["Categories"].Rows)
        {
            TreeNode nodeCategory = new TreeNode(
                row["CategoryName"].ToString(),
                row["CategoryID"].ToString());
            TreeView1.Nodes.Add(nodeCategory);
 
            DataRow[] childRows = row.GetChildRows(ds.Relations["CatProds"]);
            foreach (DataRow childRow in childRows)
            {
                TreeNode nodeProduct = new TreeNode(
                    childRow["ProductName"].ToString(),
                    childRow["ProductID"].ToString());
                nodeCategory.ChildNodes.Add(nodeProduct);
            }
            nodeCategory.Collapse();
        }
    }
 
}
 
private DataSet GetProductsAndCategories()
{
    string conStr = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection conn = new SqlConnection(conStr);
 
    string sqlCat = "SELECT CategoryID, CategoryName FROM Categories";
    string sqlProd = "SELECT ProductID, ProductName, CategoryID FROM Products";
 
    SqlDataAdapter sda = new SqlDataAdapter(sqlCat, conn);
    DataSet ds = new DataSet();
    try
    {
        conn.Open();
        sda.Fill(ds, "Categories");
        sda.SelectCommand.CommandText = sqlProd;
        sda.Fill(ds, "Products");
    }
    finally
    {
        conn.Close();
    }
 
    DataRelation relation = new DataRelation("CatProds",
        ds.Tables["Categories"].Columns["CategoryID"],
        ds.Tables["Products"].Columns["CategoryID"]);
    ds.Relations.Add(relation);
 
    return ds;
}
 
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
    if (TreeView1.SelectedNode == null)
        return;
    
    if (TreeView1.SelectedNode.Depth == 0)
    {
        lblInfo.Text = "You selected Category ID: ";
    }
    else if (TreeView1.SelectedNode.Depth == 1)
    {
        lblInfo.Text = "You selected Product ID: ";
    }
    lblInfo.Text += TreeView1.SelectedNode.Value;
}

 

 

按需填充节点

       你可能不希望一次填充大量的数据至所有的节点,这会大大增加处理第一次请求的时间,还会显著增大页面和试图状态的大小。

       TreeView 有一个按需填充的功能,可以在节点打开时填充树的分支。更妙的是,随时可以填充树的选定部分。要使用按需填充,需要把最后时刻想要填入的内容的 TreeNode 的 PopulateOnDemand 属性设为 true。用户展开这个分支时,TreeView 会引发 TreeNodePopulate 事件,在该事件里可以加入下一层节点。

 

       TreeView 支持两种按需填入节点的技术(客户端回调 或 页面回发):

  • 当 TreeView.PopulateNodesFromClient 属性为 true 的时候(默认),TreeView 执行一个客户端的回调从你的事件获得它需要的节点,而并不需要回发整个页面。
  • 当 上述属性为 false,或者为 true 但浏览器不支持客户端回调,那么 TreeView 会触发一次正常的回发以获得相同的结果。唯一的区别是整个页面的刷新产生了一个略微不平滑的界面。

 

       下面这个示例使用按需填充,先获取类别节点,然后按需填充它们的子节点:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        DataTable dtCategories = GetCategories();
 
        foreach (DataRow row in dtCategories.Rows)
        {
            TreeNode nodeCategory = new TreeNode(
                row["CategoryName"].ToString(),
                row["CategoryID"].ToString());
 
            nodeCategory.PopulateOnDemand = true;
            nodeCategory.Collapse();
            TreeView1.Nodes.Add(nodeCategory);
        }
    }
}
 
private DataTable GetCategories()
{
    string conStr = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection conn = new SqlConnection(conStr);
 
    string sqlCat = "SELECT CategoryID, CategoryName FROM Categories";
 
    SqlDataAdapter sda = new SqlDataAdapter(sqlCat, conn);
    DataSet ds = new DataSet();
    try
    {
        conn.Open();
        sda.Fill(ds, "Categories");
    }
    finally
    {
        conn.Close();
    }
 
    return ds.Tables["Categories"];
}
 
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
    if (TreeView1.SelectedNode == null)
        return;
 
    if (TreeView1.SelectedNode.Depth == 0)
    {
        lblInfo.Text = "You selected Category ID: ";
    }
    else if (TreeView1.SelectedNode.Depth == 1)
    {
        lblInfo.Text = "You selected Product ID: ";
    }
    lblInfo.Text += TreeView1.SelectedNode.Value;
}
 
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
    // 如果有多个类型的节点需要填充,你可以检查 Depth,本例不需要
    Int32 categoryID = Int32.Parse(e.Node.Value);
    DataTable dtProducts = GetProducts(categoryID);
 
    foreach (DataRow row in dtProducts.Rows)
    {
        TreeNode nodeProduct = new TreeNode(
            row["ProductName"].ToString(),
            row["ProductID"].ToString());
 
        e.Node.ChildNodes.Add(nodeProduct);
    }
}
 
private DataTable GetProducts(int categoryID)
{
    string conStr = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection conn = new SqlConnection(conStr);
 
    string sqlProd = "SELECT ProductID, ProductName, CategoryID FROM Products";
 
    SqlDataAdapter sda = new SqlDataAdapter(sqlProd, conn);
    DataSet ds = new DataSet();
    try
    {
        conn.Open();
        sda.Fill(ds, "Products");
    }
    finally
    {
        conn.Close();
    }
 
    return ds.Tables[0];
}

       一个给定的节点只会按需填充一次,此后,值保存在客户端,同一节点再次折叠或展开时不会再次执行回调。

 

 

TreeView 样式

       TreeView 有一个细化的样式模型,它允许你完全控制 TreeView 的外观。每个样式作用于一种节点,样式由 TreeNodeStyle 类表示,它继承自更常规的 Style 类。

       和其他富控件一样,通过样式可以设置前景色、背景色、字体、边框。

       此外,TreeNodeStyle 还引入下表所列的特定节点的样式属性:

ImageUrl节点旁边显示的图片
NodeSpacing当前节点与相邻节点的垂直距离
VerticalPadding节点文字与节点边界内部的垂直距离
HorizontalPadding节点文字与节点边界内部的水平距离
ChildNodesPadding展开的父节点的最后一个子节点和其下一个兄弟节点的间距

 

       TreeView 用 HTML 表哥呈现,因此你可以设置各个元素的间距来控制文字周围的边距和节点间的间距。另一个重要的属性是 TreeView.NodeIndent,它设置树结构里各个子层级间缩进的像素数。

       TreeView 还允许通过高级属性配置它的某些内部呈现。

  • 用 TreeView.ShowExpandCollapse 属性关闭树中的节点列。
  • 用 CollapseImageUrl 和 ExpandImageUrl 设置 TreeView 折叠和展开的指示器(通常由加号和减号图标表示)。
  • 用 NoExpandImageUrl 设置没有子节点的节点旁显示的图片。
  • 设置 TreeView.ShowCheckBoxes 为 true,所有节点边出现复选框。
  • 设置 TreeNode.ShowCheckBox 为 true,单个节点边出现复选框。

 

1. 把样式应用到节点类型

       要对树的所有节点应用样式,可以使用 TreeView.NodeStyle 属性。

       要以更特定的样式独立设置 TreeView 的区域,见下表:

NodeStyle应用到所有节点
RootNodeStyle仅应用到第一层 ( 根 ) 节点
ParentNodeStyle应用到所有包含其他节点的节点,但不包括根节点
LeafNodeStyle应用到所有不包含子节点而且不是根据点的节点
SelectedNodeStyle应用到当前选中的节点
HoverNodeStyle应用到鼠标停留的节点.

       样式在表中的顺序从最通用到最特定。SelectedNodeStyle 会覆盖 RootNodeStyle 里任何有冲突的设置。不过 RootNodeStyle 和 ParentNodeStyle 和 LeafNodeStyle 从来都不会产生冲突,因为根节点、父节点和子节点的定义是互斥的。例如,一个节点不能既是父节点又是根节点(TreeView 只把它看作根节点)。

 

2. 把样式运用到节点层级

       能够对不同类型的节点应用样式很有趣,不过一个更有用的功能是可基于节点的不同层级应用样式。毕竟大多的树都使用了严格的层级(例如,第一层代表类别,第二层代表产品等)。此时,确定某个节点是否有子节点并不重要,相反,确定节点的深度很重要。

       唯一的问题是,TreeView 理论上具有不受限制的节点层次。所以,暴露 FirstLevelStyle、SecondLevelStyle 之类的属性没有意义。相反,TreeView 有一个 LevelStyles 集合,它可包含你期望的项数量(第一个条目代表根层,第二个条目代表节点的第二层等)。

       例如,下面这个 TreeView 没有使用任何缩进,而是通过应用不同的间距和字体使各层都各不相同:

<asp:TreeView ID="TreeView1" runat="server" HoverNodeStyle-Font-Underline="true"
    ShowExpandCollapse="false" NodeIndent="0" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
    <LevelStyles>
        <asp:TreeNodeStyle ChildNodesPadding="10" Font-Bold="true" Font-Size="12pt" ForeColor="DarkGreen" />
        <asp:TreeNodeStyle ChildNodesPadding="5" Font-Bold="true" Font-Size="10pt" />
        <asp:TreeNodeStyle ChildNodesPadding="5" Font-Underline="true" Font-Size="10pt" />
    </LevelStyles>
</asp:TreeView>

image

 

3. TreeView 图片

       可以通过 TreeViewNode.ImageUrl 为单个节点设置图片。但要给整个树设置一组一致的图片,就不需要使用这种细化的方法。

       可以通过 3 个 TreeView 属性为整个树设置图片:

  • CollapseImageUrl :所有折叠节点的图片
  • ExpandImageUrl :所有展开节点的图片
  • NoExpandImageUrl :没有子节点因此不能展开的节点的图片

       如果设置了上述属性,并通过 TreeViewNode.ImageUrl 属性为特定节点指定了图片,节点的特定图片将优先使用。

 

       如果不想创建自定义的节点图片,TreeView 还自带了图片。访问这些图片需要使用 TreeView.ImageSet 属性,它接收来自 TreeViewImageSet 枚举的 16 个值之一。每组都包含折叠、展开和没有子节点时要使用的图片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_746838.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC 学习网站

转载于:https://www.cnblogs.com/nlsoft/archive/2013/03/24/2978563.html

大流量网站性能优化:一步一步打造一个适合自己的BigRender插件(转)

BigRender 当一个网站越来越庞大&#xff0c;加载速度越来越慢的时候&#xff0c;开发者们不得不对其进行优化&#xff0c;谁愿意访问一个需要等待 10 秒&#xff0c;20 秒才能出现的网页呢&#xff1f; 常见的也是相对简单易行的一个优化方案是 图片的延迟加载。一个庞大的页面…

运行Silverlight3 的网站弹出 IE 安全确认框

问题贴&#xff1a;http://social.microsoft.com/Forums/zh-CN/partnercndevsilverlight/thread/b2a133a3-05ab-4698-ba91-2db6a5e1d736 Q: 程序用Silverlight3写的!但是客户端安装了 Silverlight4, 有时候会弹出下面确认框. 如果在安装Silverlight3的客户端访问则不会出现上面…

Python的scrapy之爬取boss直聘网站

在我们的项目中&#xff0c;单单分析一个51job网站的工作职位可能爬取结果不太理想&#xff0c;所以我又爬取了boss直聘网的工作&#xff0c;不过boss直聘的网站一次只能展示300个职位&#xff0c;所以我们一次也只能爬取300个职位。 jobbossspider.py: # -*- coding: utf-8 -*…

ASP.NET网站部署问题集

这几天为了给客户演示我们的项目&#xff0c;发现原来程度在开发环境和部署环境中还不太一样&#xff0c;原本在开发环境中程度运行的好好的&#xff0c;而部署后装在服务器则可能产生不少的错误。因此记录下所遇到的问题&#xff0c;方便以后查询同时也希望能帮遇到相关问题的…

多屏设备网站设计

2019独角兽企业重金招聘Python工程师标准>>> 解决方案&#xff1a; 不同域名 为不同设备屏幕编写代码 相同域名 判断设备类型选择不同的视图 自适应网页设计 转载于:https://my.oschina.net/u/190049/blog/173248

一个在线学习正则表达式的网站

今天发现了一个不错的网站regexr.com&#xff0c;可以在线学习正则表达式。 如图&#xff0c;网站左边包含了常用的正则表达式&#xff0c;我们可以随时参考&#xff0c;右边是一些示例文字&#xff0c;英文段落、电话号码、网址、电子邮箱地址等都有。网站上面可以输入正则表达…

瞬时响应:网站的高性能架构

原文地址&#xff1a;http://blog.csdn.net/taochangchang/article/details/14105327 什么叫高性能的网站&#xff1f; CDN全称Content Delivery Network&#xff0c;即内容分发网络。腾讯提供的CDN服务与一般意义上的CDN服务是一样的&#xff0c;旨在将网站的静态内容发布到最…

云瓣影音网站微信端(已开源)

随着该项目的发布到线上(小打小闹)&#xff0c;即将又要开启另一段崭新的旅程。强迫自己停下来写写所学所得&#xff0c;个人认为总结和分享是一种很棒的学习方式。那让我们先来瞧瞧项目长的什么样。如果着急要源码的朋友&#xff0c;可以下拉到最后~~ 微信端部分展现 从微信端…

jitter 如何优化网络_网络推广如何做好网站SEO优化

网络推广做好网站整站SEO优化的方式有很多&#xff0c;如何才能做好SEO优化&#xff1f;一、定位网站关键词SEO给一个网站刚开始做优化的时候&#xff0c;不是立马就设置关键词&#xff0c;而是先分析该网站主要是做什么产品/服务。知道网站的目的是做什么&#xff0c;是卖产品…

如何把自己的网站部署在网上_新手如何自己建网站?

在当前&#xff0c;生活上很多事情已经和互联网息息相关了&#xff0c;每个我们都会网上浏览各种网站&#xff0c;新闻网站看新闻&#xff0c;购物网站在线购买&#xff0c;视频网站可以看视频&#xff0c;各种类型的网站基本都会有&#xff0c;企业建网站为了宣传和提供服务&a…

移动建站平台

搜狐快站是一个很不错的移动建站平台&#xff0c;而且很多功能现在都免费了。这个消息&#xff0c;对于我们这些草根创业者来说&#xff0c;无疑是天上掉了一个大馅饼砸到了我们的头上。既然馅饼掉到了俺们的头上了&#xff0c;咱们就吃了吧。对于搜狐快站&#xff0c;我就不和…

网站刷关键词_百度关键词指数怎样刷,怎么样刷关键词的权重?重庆百度快照排名...

我们在做网站优化的时候&#xff0c;通常会去看关键词的百度指数&#xff0c;选择那些有指数的关键词来重点优化。虽然原则上百度指数是自然形成的&#xff0c;但是我们通过某些方式&#xff0c;也能够有效的刷百度指数。本文重点给大家介绍下百度关键词指数怎样刷&#xff0c;…

unbantu下安装mysql_「ubuntu安装mysql」五:在Ubuntu 16.04下安装MySQL - seo实验室

ubuntu安装mysql1&#xff0c;首先执行下面三条命令&#xff1a;执行第一条命令&#xff1a;sudo apt-get install mysql-server如下图&#xff1a;输入 y &#xff0c;下载安装时会出现要求设置密码的界面&#xff1a;输入自己想设置的密码&#xff0c;之后再次输入确认密码。…

关注经典:CSS Awards 获奖网站作品赏析《第一季》

每天都有很多新的网站推出&#xff0c;其中不乏一些设计极其优秀的作品。这个系列的文章&#xff0c;我为大家挑选了2012年赢得 CSS Awards 大奖的50个最佳网站。这些鼓舞人心的网站作品代表了网页设计的最高水平&#xff0c;相信你可以得到很大的启发。 您可能感兴趣的相关文章…

ios图片放大之后如何不模糊_几个图片处理的网站

图片来源 &#xff1a;http://pexels.com在制作PPT时候我们会常常遇到以下的问题&#xff1a;问题1&#xff1a;有了一张原图&#xff0c;想找一张像素更高的图片&#xff1b;问题2&#xff1a;使用的图片像素太低、尺寸太小、模糊等&#xff1b;问题3&#xff1a;使用的图片太…

node mysql 搭建博客_用Node ejs模板 和Mysql搭建一个 个人博客网站基础

koa2-blog本项目是采用koa2框架制作的开源blog系统如果对您有帮助&#xff0c;您可以点右上角 "Star" 支持一下 谢谢&#xff01; ^_^如果你觉得对你有帮助&#xff0c;可以点击folk&#xff0c;或者follow一下&#xff0c;我会不定时跟新一些有趣的东西.~~~ 0.0koa2…

微软推出一个非常有趣的网站—— How-old.net 看照片猜年龄!

周末休闲一下啊&#xff01;&#xff01;微软推出一个非常有趣的网站—— How-old.net 看照片猜年龄&#xff01;这是由微软机器学习团队的工程师们开发的一个“年龄测试”的新玩意&#xff0c;通过图像脸部识别和大数据分析&#xff0c;可以快速识别出照片中的人的性别和年龄&…

电子商务网站-数据库设计

转载 陈小龙哈 2015-07-22 13:58:39 评论(0) 496人阅读 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104…

9个免费的矢量图网站

寻找一些特别的&#xff0c;为众所不知的矢量图网站不是一件容易的事情&#xff0c;又要高质量&#xff0c;又要免费使用&#xff0c;尽管鱼和熊掌不能兼得&#xff0c;但是谁叫我们碰到了互联网时代呢&#xff0c;谁叫我们知道一句台词&#xff1a;一切皆有可能呢&#xff01;…