您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



[cc]P19 2.3.2重写RenderContents方法的实例
狼子 发表于 2007-6-3 0:24:00 阅读全文 | 回复(0) | 引用通告 | 编辑

这个是我做的第三个例子,也是书上的第三个例子,我新建了一个叫MicMenu的web组件项目,修改默认cs文件为:MicMenuBar.cs,以下是按书上的代码录入的,有一些改动,因为我对这个代码进行了代码分析,按分析结果修改过,还有就是加了一些自己的理解,最后是我是在vs.net2005下学习的,书本是vs.net2003的

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
[assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = false)]
[assembly: CLSCompliant(true)]


namespace MicMenu
{
    //本实例主要用于说明基于WebControl基类的呈现控件方法
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:MicMenuBar runat=server></{0}:MicMenuBar>")]

    public class MicMenuBar : System.Web.UI.WebControls.WebControl
    {
        #region 定义变量,并定义默认值
        //这里定义的变量和自定义用户控件里的使用是完全一样的
        private string text = "";
        private string href = "";
        private string fontfamily = "宋体";
        private string fontsize = "12px";
        private string width = "100%";
        private string height = "";
        private string target = "_self";
        private bool displayPipe = true;
        #endregion

        #region 构造函数
        //P25 ②定义类的构造函数public WebCustomControl():base(HtmlTextWriterTag.Div),此句说明该服务器控件是基于<Div>控件的
        //基于<div>控件的意思,可以对应生成的html代码看到,就是指这个控件生成的html代码,是全部包含在<div></div>之间的
        public MicMenuBar()
            : base(HtmlTextWriterTag.Div)
        {
           
        }
        #endregion

        #region 定义属性
        //设置属性访问上面定义的成员变量
        [Description("该属性用于表示控件显示的文字内容")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        [Description("该属性用于表示控件显示的文字的超链接地址")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        public string Href
        {
            get { return href; }
            set { href = value; }
        }

        [Description("该属性用于表示控件显示的文字的大小")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("12px")]
        public string FontSize
        {
            get { return fontsize; }
            set { fontsize = value; }
        }

        [Description("该属性用于表示控件显示的文字的字体")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("宋体")]
        public string FontFamily
        {
            get { return fontfamily; }
            set { fontfamily = value; }
        }

        [Description("该属性用于表示控件显示超链接的目标框架")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("_self")]
        public string Target
        {
            get { return target; }
            set { target = value; }
        }

        [Description("该属性用于表示控件是否显示分隔符")]
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("true")]
        public bool DisplayPipe
        {
            get { return displayPipe; }
            set { displayPipe = value; }
        }
        #endregion

        //将自定义样式写入HTTP输出流中去
        //这一段生成的样式,是直接加在控件上的,就是加在包含这个控件生成的所有html代码的那个<div>上
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            //定义控件div样式
            writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#f1f1f1");
            writer.AddStyleAttribute("white-space", "nowrap");
            writer.AddStyleAttribute("border-top", "#999 1px solid");
            writer.AddStyleAttribute("padding-bottom", "#999 1px solid");
            writer.AddStyleAttribute("padding-top", "2px");
            writer.AddStyleAttribute("width", width);
            writer.AddStyleAttribute("height", height);
            base.AddAttributesToRender(writer);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            //定义样式
            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "10px");
            writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, fontsize);
            writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, fontfamily);
            writer.RenderBeginTag(HtmlTextWriterTag.Span);

            //定义样式
            writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "black");
            writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "none");
            writer.AddStyleAttribute("border", "#f1f1f1 1px solid");
            //writer.AddStyleAttribute("display", "block");
            writer.AddStyleAttribute("padding-right", "6px");
            writer.AddStyleAttribute("padding-left", "6px");
            writer.AddStyleAttribute("padding-bottom", "2px");
            writer.AddStyleAttribute("padding-top", "2px");
            writer.AddAttribute("onmouseout",  "this.style.cssText='color:black; text-decoration:none; border:#f1f1f1 1px solid; padding-right:6px; padding-left:6px; padding-bottom:2px; padding-top:2px;'");
            writer.AddAttribute("onmouseover", "this.style.cssText='color:black; text-decoration:none; border:#999999 1px solid; padding-right:6px; padding-left:6px; padding-bottom:2px; padding-top:2px; background:#cccccc;'");

            writer.AddAttribute(HtmlTextWriterAttribute.Href, href);
            writer.AddAttribute(HtmlTextWriterAttribute.Target, target);
            writer.RenderBeginTag(HtmlTextWriterTag.A);
            writer.Write(text);
            writer.RenderEndTag();
            writer.RenderEndTag();

            //定义分隔符及样式
            if (displayPipe)
            {
                writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "#a9a9a9");
                writer.AddStyleAttribute("font", "70%");
                writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, fontsize);
                writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, fontfamily);
                writer.AddStyleAttribute("padding-right", "3px");
                writer.AddStyleAttribute("padding-left", "3px");
                writer.RenderBeginTag(HtmlTextWriterTag.Span);
                writer.Write("|");
                writer.RenderEndTag();
            }
            else
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Span);
                writer.Write("&nbsp;");
                writer.RenderEndTag();
            }

            //使用默认逻辑来呈现子控件
            base.RenderContents(writer);
        }
    }
}

生成这个MicMenu后,就可以在别的网站里引用控件了,测试代码是这个:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="P19_RenderContents.aspx.cs" Inherits="P19_RenderContents" %>

<%@ Register Assembly="micMenu" Namespace="MicMenu" TagPrefix="cc1" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table id="table5" width="100%" border="0" cellpadding="0" cellspacing="0">
            <tr>
                <td>
                    <cc1:micmenubar id="MicMenuBar1" runat="server" text="微软中国" Href="http://localhost" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
                </td>
                <td>
                    <cc1:micmenubar id="MicMenuBar2" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
                </td>
                <td>
                    <cc1:micmenubar id="MicMenuBar3" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
                </td>
                <td width="100%">
                    <cc1:micmenubar id="MicMenuBar4" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

P17

在呈现控件的过程中,首先要定义服务器控件的属性和CSS样式等内容,然后再定义服务器控件的主体内容,这种顺序昌不能改变的。

对这句话我做过测试,我把AddStyleAttribute方法写在RenderBeginTag后面,生成的控件是没有设置过CSS的,AddStyleAttribute方法就好像被注释了一样

P25

通过分析代码,可以明确实现WebCustomControl类的基本过程。

①定义局部变量并赋予默认值。

②定义类的构造函数public WebCustomControl():base(HtmlTextWriterTag.Div),此句说明该服务器控件是基于<Div>控件的。

③定义6个属性:Text、FontSize、FontFamily、Href、Target和displayPipe。

④重写AddAttributesToRender方法,将自定义样式写入HTTP输出流中。

⑤重写呈现控件的方法RenderContents,其中包括定义其他样式及客户端行为的内容。

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.