Asp.net2.0之自定义控件ImageButton

上个星期三开始学自定义控件,做了不少练习。花了一上午时间写了一个imageButton,以前就像写这个控件,只是不会。

图片

正文

这个控件模仿winform中的button,可以支持图片和文字。可以选择执行服务器端程序还是客户端程序,还有一些简单的设置。

不足的是不支持样式,下次希望可以写一个工具条。

以下就是代码


以下为引用的内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
namespace ClassLibrary1
{
    [Serializable]
    public class Picture
    {
       
        private Unit height = 16;
        
        private string src = string.Empty;
        [NotifyParentProperty(true)]
        [Browsable(true), Bindable(true), Description("图片路径"), Category("Appearance")]
        [Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
        public string Src
        {
            get { return this.src; }
            set { this.src = value; }
        }
        [DefaultValue(typeof(Unit),"16px") ]
        [NotifyParentProperty(true)]
        public Unit Height
        {
            get { return height; }
            set { height = value; }
        }
        private Unit width = 16;
        [NotifyParentProperty(true)]
        [DefaultValue(typeof(Unit),"16px")]
        public Unit Width
        {
            get { return width; }
            set { width = value; }
        }
    
       public enum Align{Left ,Right  }

    }
    [Serializable] 
    public class Label
    {
       
       
        private string text = string.Empty;
        [NotifyParentProperty(true)]
        public string Text
        {
            get { return text; }
            set { text = value; }
        }
        private System.Drawing.Font fontFamily=new System.Drawing.Font("宋体",8);

        
[NotifyParentProperty(true)]
        public System.Drawing.Font  Font
        {
            get { return this.fontFamily; }
            set { this.fontFamily = value; }
        }
         
    }
    [PersistChildren(false )]
    [ParseChildren(true)]
   public  class ImageButton:Control ,INamingContainer,IPostBackEventHandler  
    {
        public  enum RaiseEventType {Client,Server }
       private Picture pic = new Picture();
       private Picture.Align picAlign = Picture.Align.Left;
       private Label label = new Label ();
       private string jsFunction = string.Empty;
       private static readonly object clickKey = new object();
       public  enum TextAlign {Left ,Center,Right }
       [Browsable(true), Bindable(true), Description("javascript方法"), Category("Action")]
       public string JSFunction
       {
           get { return this.jsFunction; }
           set { this.jsFunction = value; }
       }

        private  RaiseEventType  raiseEvent=RaiseEventType.Server ;
        [Browsable(true), Bindable(true), Description("响应事件方式"), Category("Action")]
        public RaiseEventType RaiseEvent
        {
            get { return this.raiseEvent; }
            set { this.raiseEvent = value; }
        }
        

       private TextAlign align = TextAlign.Left;
       [Browsable(true), Bindable(true), Description("文字的对齐方式"), Category("Appearance")]
       public  TextAlign ALign
       {
           get { return align; }
           set { align = value; }

       }
       private Unit width = 80;
       [Browsable(true), Bindable(true), Description("控件宽度"), Category("Appearance")]
        [DefaultValue(typeof(Unit),"80px") ]
       public Unit Width
       {
           get { return this.width; }
           set { this.width = value; }
       }

        [Browsable(true),Bindable(true),Category("Action")]
       public event EventHandler OnClick
       {
           add
           {
               Events.AddHandler(clickKey ,value); 
           }
           remove
           {
               Events.RemoveHandler(clickKey ,value);
           }
       }
        [Browsable(true), Bindable(true), Description("图片类"), Category("Appearance")]
        public Picture.Align PicAlign
        {
            get { return picAlign; }
            set { picAlign = value; }
        }
     
       [Browsable(true),Bindable(true),Description("图片类"),Category("Appearance")]
       [DesignerSerializationVisibility(DesignerSerializationVisibility.Content) ]
       [TypeConverter(typeof(ExpandableObjectConverter))]
        [PersistenceMode(PersistenceMode.InnerProperty)]   
       public Picture Pic
       {
           get { return pic; }
           
       }
       [Browsable(true),Bindable(true),Description("文字类"),Category("Appearance")]
       [DesignerSerializationVisibility(DesignerSerializationVisibility.Content) ]
       [TypeConverter(typeof(ExpandableObjectConverter) )]
        [PersistenceMode(PersistenceMode.InnerProperty)]  
       public Label Label
       {
           get { return label; }
          
       }
       protected override void Render(HtmlTextWriter writer)
       {
           if (raiseEvent == RaiseEventType.Server)
           {
               writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference(this, this.ClientID));
           }
           else
           {
               writer.AddAttribute(HtmlTextWriterAttribute.Onclick ,"javascript:"+this.jsFunction); 
           }
         
           writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor ,"hand"); 
           writer.AddStyleAttribute(HtmlTextWriterStyle.Width,this.width.Value.ToString() +"px");
           if (align == TextAlign.Left)
           {
               writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign ,"left" );
           }
           else if (align == TextAlign.Center)
           {
               writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "center");
           }
           else
           {
               writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign ,"right");
           }
        
           writer.RenderBeginTag(HtmlTextWriterTag.Div ); 
 
          
           if (PicAlign == Picture.Align.Left)
           {
               AddPic(writer);
               AddLabel(writer);
           }
           else
           {AddLabel(writer);
               AddPic(writer);
               
           }
           writer.RenderEndTag(); 
           //base.Render(writer);
       }
       private void AddPic(HtmlTextWriter writer)
       {
          
           writer.AddAttribute(HtmlTextWriterAttribute.Src,base.ResolveClientUrl(pic.Src));
           writer.AddAttribute(HtmlTextWriterAttribute.Height ,pic.Height.ToString());
           writer.AddAttribute(HtmlTextWriterAttribute.Width ,pic.Width.ToString());
         
           writer.RenderBeginTag(HtmlTextWriterTag.Img);
           writer.RenderEndTag(); 
          // writer.Write("<image src='"+this.Src+"' height="+pic.Height+" width="+pic.Width+" />"); 
       }
       private void AddLabel(HtmlTextWriter writer)
       {
           writer.AddStyleAttribute(HtmlTextWriterStyle.VerticalAlign,"middle");
           writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize ,label.Font.Size.ToString()+"pt");
           writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily,label.Font.FontFamily.Name );
           if(label.Font.Bold)
           {

           writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight,"Bold" );
           }
           writer.RenderBeginTag(HtmlTextWriterTag.Label);

           writer.Write(label.Text==string.Empty ?this.ClientID.ToString():label.Text);
           writer.RenderEndTag(); 
           //writer.Write("<label>" + Label.Text + "</label>");
       }

       #region IPostBackEventHandler 成员

       public void RaisePostBackEvent(string eventArgument)
       {
           EventHandler e = (EventHandler)Events[clickKey];
           if(e!=null)
           {
               e(this,EventArgs.Empty );
           }
       }

       #endregion

毕竟是刚学,肯定会有很多不足和错误,希望大家指正,谢谢。

结尾,继续努力,看完其它的资料。

时间: 2024-10-28 13:34:26

Asp.net2.0之自定义控件ImageButton的相关文章

ASP.Net2.0中自定义控件在page中的注册

asp.net|控件 今天在网上看到ASP.Net 2.0中注册自定义控件的好方法,记录如下. 在web.config 文件中全局注册自定义控件 <system.web>      <pages>        <controls>          <add tagPrefix="rx" assembly="HYLQ.Component" namespace="HYLQ.Component"/> 

ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性                                         深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第三篇 ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 ASP.NET自定义控件组件开发 第三章 为控件添加事件 前

ASP.NET2.0的控件状态和视图状态探讨

asp.net|控件|视图 基本概念 控件状态-为了让控件正常工作,有时需要存储控件状态数据.例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡.ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件.为解决此问题,ASP.NET 页框架在 ASP.NET 2.0 版中公开了一种称为控件状态的新功能. ControlState 属性允许保持特定于控件的属性信息,不像 Vie

ASP.NET2.0组件控件开发视频 初体验

原文:ASP.NET2.0组件控件开发视频 初体验                               ASP.NET2.0组件控件开发视频 初体验        录了视频,质量不是很好,大家体验下.我会重新录制的 如果不清楚,可以看看http://v.youku.com/v_show/id_XNDg0MTAxNjA=.html   系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发

【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件

分页控件正式命名为 QuickPager ASP.NET2.0分页控件 . 版本号:2.0.0.1 Framework:.net2.0 分页方式:PostBack .URL (暂时没有实现URL的分页方式) webform  (b/s) 支持多种数据库,分页算法,提取数据的方式都可以替换.     分页,自从做b/s的项目起,就和分页打起了交到,一开始使用UserControl来做,很粗糙,也没有什么性能可言.但是分页又是不可避免的,一次提取全部的数据,咱用的资源太多,吃不消.于是乎就在不断的想

基于ASP.NET2.0的非HttpModule山寨版MVC框架的实现

在ASP.Net MVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦.本文通过代码实践,在ASP.Net2.0框架下实现一套简易的MVC框架.MVC框架难于构建的地方在于Controller与View的分离以及分离后数据可以方便地传输.为了保持代码的简洁,将使用ashx文件作为Controller,用aspx页面作为View. 讲起来比较费劲,把项目文件放上来,而下面只作一个简单的说明.项目是VS2008的项目,大小15K. 下载地址:DotNetMVC.rar 首先构建一个

asp.net2.0下 如何实现服务器端压缩包自解压

asp.net2.0下,如何实现服务器端压缩包自解压using System;using System.Data;using System.Configuration;using System.Web; using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlContr

ASP.NET2.0 HiddenField控件

asp.net|控件    HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据.也许这个时候应该有这么一个疑问,为什么有了ViewState.Session和Cookie等状态保存机制,还需要用起HiddenField呢?增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全面.因为不管是ViewState.Cookie还是Session,都有其失效的时候,比如用户因某种需求要求设置ViewState为fa

ASP.NET2.0:Ilungasoft.Framework.Web之基于Callback的无刷新上传进度条控件[带源码]

asp.net|web|控件|上传|刷新|无刷新 共享一个基于Callback的无刷新上传进度条控件的源码.本控件使用的HttpMoudule基于宝玉的一个上传进度条的sample,这里封装为一个控件,方便使用.无需任何代码,只需设置web.config,添加HttpModule的引用,再将控件拖到页面就行.页面中的文件保存操作和传统的asp.net文件上传完全一样.可以设置属性上传过程中出错或上传成功时跳转到其它页面.兼容IE,Firefox,Opera.其它环境没测试,不过因为是基于Asp.