首页 > 编程 > .NET > 正文

开发asp.net自定义控件(asp.net学习笔记三)

2024-07-10 12:55:47
字体:
来源:转载
供稿:网友
 

上一章我们写了一个最简单的自定义控件,此次让我们抛开理论,实际开发一个具有实用意义的自定义控件:一个可以设置权限的菜单。

在这个项目中我们将不采用任何未学到的理论知识,用户只需要具有基本的dhtml知识就可以。如你所知,服务器控件不过是对一些html及javascript的封装罢了。至于其它的技巧,将来我们会逐渐提及并应用,最终生产出具有商业水准的控件来。

制作这个控件的思路很简单:首先使用dhtml写出一个菜单来,然后把其中的属性提取出来,接着封装起脚本与html显示代码,最后将其作为参数重写render方法。你看,就这么简单。

如果不想透过浏览器阅读代码(那实在很讨厌),你可以到如下地址下载这个项目的源码,其中包括这个自定义控件的源代码及各类测试文件:不同的数据源以及权限设定。

http://user1.7host.com/cashtsao//cashmenu0110.zip

 

首先在名称空间cashcontrols中声明一个枚举类型mainmenualign:

public enum mainmenualign

    {

        /// <summary>

        /// 左

        /// </summary>

        left=0,

        /// <summary>

        /// 中间

        /// </summary>

        center=1,

        /// <summary>

        /// 右

        /// </summary>

        right=2

    }

接着声明继承自webcontrols的类cashmenu,声明如下变量及属性:

变量:

private system.web.httpcontext contextobject;

        private system.xml.xmldocument oxmldoc=new xmldocument();

        private string menudata;

        private mainmenualign mainmenualign=mainmenualign.center;

        private string rulestring="admin";

        private int cellspacing;

        private int mainmenuheight;

属性:

/// <summary>

        /// 属性menudata用于指定数据源,可以是某个xml文件,

///也可以是xml格式之字符串

        /// </summary>

        [bindable(true),

        category("data"),description("为menu提供xml数据源.")]

public string menudata

        {

            get

            {

                return menudata;

            }

 

            set

            {

                menudata = value;

                build();

            }

        }

 

......

 

声明辅助方法:

/// <summary>

        /// 方法build用于绑写数据源,将其绑定到context上,在属性menudata中调用

        /// </summary>

        private void build()

        {

            if (menudata!=null)

                try

                {

                    contextobject = this.context;

                    if (contextobject!=null)

                        oxmldoc.load(contextobject.server.mappath(menudata));

                }

                catch

                {

                    try

                    {

                        oxmldoc.loadxml(menudata);

                    }

                    catch (exception e)

                    {

                        contextobject.response.write("打开数据源失败!<br>");

                        contextobject.response.write(e.message);

                    }

                }

            return;

        }

        /// <summary>

        /// 方法generatehtml用于生成html代码,调用traversemenutree方法,传递context中oxmldoc的一个节点进去

/// </summary>

        /// <returns></returns>

        private string generatehtml()

        {

            string temphtml = "";

            if (oxmldoc.childnodes.count !=0) 

            {

                try

                {

                    temphtml = temphtml + traversemenutree(oxmldoc.childnodes.item(1).firstchild);

                }

                catch

                {

                    throw new argumentexception("发生错误."); 

                }

            }

            return(temphtml);

           

        }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表