前言
上個星期三開始學自定義控件,做了不少練習。花了一上午時間寫了一個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
畢竟是剛學,肯定會有很多不足和錯誤,希望大家指正,謝謝。
結尾,繼續努力,看完其它的資料。
原文地址:http://www.cnblogs.com/flyskyer/archive/2009/08/31/1557178.Html