• ASP.NET控件开发学习笔记第3回 自制导航控件


     

    3 自制导航控件

    做了这么些Hello Wrold,已经出现审美疲劳,下面来点新鲜的东西,制作一个相对较综合的控件。比如我们制作网站时有一组链接需要放在一起,很多时候我们使用静态网页直接把这些链接呈现在浏览器内,这个方法并不好,能不能把链接名称和URL放在数据库内,自动生成一个模块容纳这些链接呢?当然,如果使用数据库的话,各位的机子上可能没有安装数据库,所以这里使用了XML来存储这些链接,以方便大家运行这个程序。另外,紧跟潮流,使内容和显示分离,我们使用CSS定制外观。虽然使用到了其他技术,但效果感觉还是不错的,下面就来制作这个控件。

    首先建立XML文件存储链接,在虚拟目录下新建一个“linksList.xml”,输入代码如下:

    3-1代码1linksList.xml代码

    <?xml version="1.0" encoding="utf-8" ?>
    <MyLinks>
        
    <link>
            
    <name>我的博客</name>
            
    <url>http://cgbluesky.blog.163.com/</url>
        
    </link>
        
    <link>
            
    <name>北京大学出版社第六事业部</name>
            
    <url>http://www.pup6.com/ebook.htm</url>
        
    </link>
        
    <link>
            
    <name>网易学院</name>
            
    <url>http://tech.163.com/school/video/</url>
        
    </link>
        
    <link>
            
    <name>eNet硅谷动力网络学院</name>
            
    <url>http://tech.163.com/school/video/</url>
        
    </link>
        
    <link>
            
    <name>细品人生</name>
            
    <url>http://blog.sina.com.cn/chanamy</url>
        
    </link>
    </MyLinks>

     

    这里存储了一个link表,表有两个字段,第一个字段是name,表示链接名,第二个字段是url,表示链接地址。接下来制作控件,在App_Code文件夹下新建一个“linksList.cs”文件,输入代码如下:

    3-1代码2linksList.cs代码


    using System;
    using System.Web.UI;
    using System.Data;
    using System.Data.OleDb;
    [assembly:TagPrefix(
    "MyControl""CG")]
    namespace MyControl
    {
        
    public class LinksControl:Control
        {
            
    protected override void Render(HtmlTextWriter writer)
            {
                writer.WriteLine(
    "<ul>");
                writer.WriteLine(
    "<li id='caption'>我的导航控件</li>");
                
    string s;
                DataSet ds
    =new DataSet();
                ds.ReadXml(Page.Server.MapPath(
    "linksList.xml"));
                
    foreach(DataRow row in ds.Tables["link"].Rows)
                {
                    s
    ="<li><a href='";
                    s
    +=row["url"].ToString();
                    s
    +="'target='_blank'>";
                    s
    +=row["name"].ToString();
                    s
    +="</a></li>";
                    writer.WriteLine(s);
                }
                writer.WriteLine(
    "</ul>");
            }
        }
    }

     

    从这段代码可以看出,我们使用无序列表来显示这些链接,列表的第一项为导航条名称。这里使用DataSet来读取XML,使用非常方便。DataSet控件真是强悍,不但能装下整个数据库,还能如此方便地控制XML。这个控件所输出的列表素面朝天,并不是能让人满意,下面使用一个CSS来装饰它。在虚拟目录下新建一个“linkslist.css”文件,在其中输入如下代码:

    3-1代码3linkslist.css代码


    ul
    {
        list-style-type
    :none;
        margin
    :5px;
        padding
    :2px;
        border
    :1px solid #DDDDDD;
        width
    :200px;
        font
    :12px 宋体,sans-serif;
    }
    li
    {
        background
    : #DDDDDD;
        margin
    :0;
        border
    :1px solid #fff;
    }
    #caption
    {
        color
    :#FFF;
        background
    : #663333;
        padding
    :2px 10px;
        font
    :bold;
    }
    ul a:link, ul a:visited, ul a:hover, ul a:active
    {
        color
    :#333;
        display
    :block;
        padding
    :2px 10px;
        text-decoration
    :none;
    }
    ul a:hover
    {
        color
    :#FFF;
        background
    :#666;
    }

     

    好!所有准备工作都做完了,下面调用控件来看看效果如何。在虚拟目录下新建一个“linkslist.aspx”文件,并输入如下代码:

    3-1代码4linkslist.aspx代码


    <%@Register TagPrefix="CG" Namespace="MyControl" %>
    <html>
        
    <head>
            
    <title>Chapter 5: Background Images</title>
            
    <link rel='Stylesheet' media="screen" type='text/css' href='linkslist.css' />
        
    </head>
        
    <body>
            
    <div id="container">
            
    <CG:LinksControl runat="server" />
            
    </div>
        
    </body>
    </html>

     

    在浏览器中运行linkslist.aspx文件,效果如图3-1所示。很棒吧!



     

    经过CSS的修饰,列表中的项看上去很象按钮,鼠标放上去时会自动改变颜色。为了演示使用这个控件好好处,我们更改XML文件,在里面多加一个链接:

    3-2代码1linksList.xml代码


    <?xml version="1.0" encoding="utf-8" ?>
    <MyLinks>
        
    <link>
            
    <name>我的博客</name>
            
    <url>http://cgbluesky.blog.163.com/</url>
        
    </link>
        
    <link>
            
    <name>浪曦视频在线</name>
            
    <url>http://bbs.langsin.com/</url>
        
    </link>
        
    <link>
            
    <name>北京大学出版社第六事业部</name>
            
    <url>http://www.pup6.com/ebook.htm</url>
        
    </link>
        
    <link>
            
    <name>网易学院</name>
            
    <url>http://tech.163.com/school/video/</url>
        
    </link>
        
    <link>
            
    <name>eNet硅谷动力网络学院</name>
            
    <url>http://tech.163.com/school/video/</url>
        
    </link>
        
    <link>
            
    <name>eNet细品人生</name>
            
    <url>http://blog.sina.com.cn/chanamy</url>
        
    </link>
    </MyLinks>

     

    然后更改样式,修改linkslist.css代码如下:

    3-2代码2linkslist.css代码


    ul
    {
        list-style-type
    :none;
        margin
    :5px;
        padding
    :1px;
        border
    :1px solid #333;
        width
    :200px;
        font
    :12px 宋体,sans-serif;
    }
    li
    {
        background
    : #ABD1BD;
        margin
    :0;
        border-left
    :1px solid #fff;
        border-top
    :1px solid #fff;
        border-right
    :1px solid #aaa;
        border-bottom
    :1px solid #666;
    }
    #caption
    {
        color
    :#FFF;
        background
    : #557A66;
        padding
    :2px 10px;
        font
    :bold;
    }
    ul a:link, ul a:visited, ul a:hover, ul a:active
    {
        color
    :#000;
        display
    :block;
        padding
    :2px 10px;
        text-decoration
    :none;
    }
    ul a:hover
    {
        color
    :#FFF;
        background
    :#147E46;
    }
     

    再次运行linkslist.aspx,效果如图3-2所示:


     

    这一次,不但自动增加了一个链接,而且,控件的外观也改变了。但它还有一些缺点,比如导航条的标题栏内容不能定制,所读取的XML文件也不能定制,该如何解决呢?请听下回分解。


  • 相关阅读:
    iOS 开发中的坑与相关技巧
    SDK 封装的相关看法
    线程问题---在iPad上会崩溃,在iPhone上不会崩溃
    添加新手引导页需要注意的几个小点
    iOS 七牛云上传并获取图片----【客户端】
    iOS 线程相关-----绝对de干货
    Vue.js 基础示例
    lib-flexible 结合 WKWebView 的样式错乱解决方法
    基于CommentCoreLibrary简单的弹幕实现
    页面上动态编译及执行java代码
  • 原文地址:https://www.cnblogs.com/abatei/p/1080207.html
Copyright © 2020-2023  润新知