开发自定义网页控件简介

分享于 

9分钟阅读

Web开发

  繁體

介绍

每个组织都有自己的控制来加快软件开发。 我的组织有一个标准的方法来在Web应用程序上显示信息。错误和警告。 所以我认为为了使不同的项目能够使用同一控件,并且对外观和感觉有充分的控制。 虽然我在过去两年中一直在开发 C# 组件,但这是开发UI开发人员自定义控件的第一次机会。 我完全被定制网页控件的强大能力和 Visual Studio IDE的设计时间支持所震撼。

Points of interest

  • 设计时编辑器

    InfoImage 属性用于设置信息的图像 URL。 这里代码的特殊属性是 Editor 属性,它允许窗口浏览本地文件映像并选择我们需要的那些映像:

    [Bindable(true), Category("Information Details"), DefaultValue(""),
    Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, 
    Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
    typeof(UITypeEditor))]publicstring InfoImage{
     get{
     returnthis._InfoImage;
     }
     set{
     this._InfoImage = value;
     }
    }
  • 在设计时隐藏继承的属性

    自定义控件继承自 System.Web.UI.WebControls.WebControl 类有一些默认属性,如 forecolorbackcolor 等等。 AccessKey 是设计时显示的其中之一。 我不希望在设计时将这里属性显示给用户。 因此,有一个称为 Browsable的特殊属性,如果设置为 false 在设计时不显示属性。

    [Browsable(false), Bindable(false)]publicoverridestring AccessKey {
     get {
     returnbase.AccessKey;
     }
     set {
     base.AccessKey = value;
     }
    }
  • 隐藏详细消息

    如果控件的IsDebug 属性设置为 true 然后显示详细信息。 如果要调试某些页,并且要查看详细错误消息,则可以将控件的IsDebug 属性设置为 true :

    [Bindable(true),Category("Behavior"),DefaultValue(false)]publicbool IsDebug{
     get{
     returnthis._IsDebug;
     }
     set{
     this._IsDebug = value;
     }
    }
  • 异常支持

    这里控件直接接受 System.Exception 类的对象,并将消息和堆栈跟踪设置为该控件:

    [Browsable(false),Bindable(true),DefaultValue(null)]public Exception Exception{
     set{
     this._Exception = value;
     Text = this._Exception.Message;
     Details = 
     this._Exception.StackTrace+"nn"+this._Exception.TargetSite;
     MsgType = MessageType.ERROR;
     }
    }
  • 呈现控件

    控件在设计时呈现,与在运行时呈现非常类似。 所以控件更像被所见,但更容易和方便:

    ///<summary>/// Render this control to the output parameter specified.///</summary>protectedoverridevoid Render(HtmlTextWriter output)
    {
     if(Enabled){
     output.AddAttribute(HtmlTextWriterAttribute.Title,
     ToolTip,false);
     output.AddAttribute(HtmlTextWriterAttribute.Cellpadding,
     this.Cellpadding,false);
     output.AddAttribute(HtmlTextWriterAttribute.Cellspacing,
     this.Cellspacing,false);
     output.AddAttribute(HtmlTextWriterAttribute.Border, 
     BorderWidth.Value.ToString(),false);
     output.AddAttribute(HtmlTextWriterAttribute.Bordercolor, 
     BorderColor.Name,false);
     output.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, 
     BorderStyle.ToString());
     output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, 
     BackColor.Name,false);
     output.AddAttribute(HtmlTextWriterAttribute.Width,
     (Width.Value.ToString()+GetUnit(Width.Type)),false);
     output.AddAttribute(HtmlTextWriterAttribute.Height,
     (Height.Value.ToString()+GetUnit(Height.Type)),false);
     output.AddAttribute(HtmlTextWriterAttribute.Class,
     CssClass,false);
     output.RenderBeginTag(HtmlTextWriterTag.Table);
     RenderHeader(output);
     RenderInfo(output);
     if(IsDebug && Details.Length >0){
     RenderDetails(output);
     }
     output.RenderEndTag();
     }
    }privatevoid RenderHeader(HtmlTextWriter output){
     output.RenderBeginTag(HtmlTextWriterTag.Tr);
     output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, 
     TdBackColor.Name,false);
     output.AddAttribute(HtmlTextWriterAttribute.Rowspan,"2", 
     false);
     output.AddAttribute(HtmlTextWriterAttribute.Width,"0%", 
     false);
     output.AddAttribute(HtmlTextWriterAttribute.Height,"0%", 
     false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     switch(MsgType){
     case MessageType.ERROR:
     output.AddAttribute(HtmlTextWriterAttribute.Src, 
     ErrorImage,false);
     break;
     case MessageType.WARNING:
     output.AddAttribute(HtmlTextWriterAttribute.Src, 
     WarningImage,false);
     break;
     default:
     output.AddAttribute(HtmlTextWriterAttribute.Src,
     InfoImage,false);
     break;
     }
     output.RenderBeginTag(HtmlTextWriterTag.Img);
     output.RenderEndTag();
     output.RenderEndTag();
     output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, 
     TdBackColor.Name,false);
     output.AddAttribute(HtmlTextWriterAttribute.Width,"100%",false);
     output.AddAttribute(HtmlTextWriterAttribute.Height,"100%",false);
     switch(MsgType){
     case MessageType.ERROR:
     output.AddAttribute(HtmlTextWriterAttribute.Class, 
     ErrorHeaderTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(ErrorHeaderText);
     output.RenderEndTag();
     break;
     case MessageType.WARNING:
     output.AddAttribute(HtmlTextWriterAttribute.Class, 
     WarningHeaderTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(WarningHeaderText);
     output.RenderEndTag();
     break;
     default:
     output.AddAttribute(HtmlTextWriterAttribute.Class,
     InfoHeaderTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(InfoHeaderText);
     output.RenderEndTag();
     break;
     }
     output.RenderEndTag();
    }privatevoid RenderInfo(HtmlTextWriter output){
     output.RenderBeginTag(HtmlTextWriterTag.Tr);
     output.AddAttribute(HtmlTextWriterAttribute.Bgcolor,
     TdBackColor.Name,false);
     switch(MsgType){
     case MessageType.ERROR:
     output.AddAttribute(HtmlTextWriterAttribute.Class,
     ErrorBreifTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Text);
     output.RenderEndTag();
     break;
     case MessageType.WARNING:
     output.AddAttribute(HtmlTextWriterAttribute.Class, 
     WarningBreifTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Text);
     output.RenderEndTag();
     break;
     default:
     output.AddAttribute(HtmlTextWriterAttribute.Class, 
     InfoBreifTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Text);
     output.RenderEndTag();
     break;
     }
     output.RenderEndTag();
    }privatevoid RenderDetails(HtmlTextWriter output){
     output.RenderBeginTag(HtmlTextWriterTag.Tr);
     output.AddAttribute(HtmlTextWriterAttribute.Bgcolor,
     TdBackColor.Name,false);
     output.AddAttribute(HtmlTextWriterAttribute.Colspan,"2",false);
     switch(MsgType){
     case MessageType.ERROR:
     output.AddAttribute(HtmlTextWriterAttribute.Class,
     ErrorDetailsTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Details);
     output.RenderEndTag();
     break;
     case MessageType.WARNING:
     output.AddAttribute(HtmlTextWriterAttribute.Class, 
     WarningDetailsTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Details);
     output.RenderEndTag();
     break;
     default:
     output.AddAttribute(HtmlTextWriterAttribute.Class,
     InfoDetailsTextCss,false);
     output.RenderBeginTag(HtmlTextWriterTag.Td);
     output.Write(Details);
     output.RenderEndTag();
     break;
     }
     output.RenderEndTag();
    }

进一步工作

处理可以触发事件,管理客户端数据并回发到数据的Web控件。


相关文章