题目:创建一个自定义WebControl控件 WebImageButton的过程
关键字:WebControl,ImageButton,EventArgs
关键字:WebControl,ImageButton,EventArgs
简要:WebImageButton 继承于 System.Web.UI.WebControls.WebControl,该控件具有WebControl的公共属性、方法和事件,同时可以在这些基础上进行功能扩充。本例就是在WebControl的基础上创建其它Web控件,构成一个复合控件。
简要:WebImageButton 继承于 System.Web.UI.WebControls.WebControl,该控件具有WebControl的公共属性、方法和事件,同时可以在这些基础上进行功能扩充。本例就是在WebControl的基础上创建其它Web控件,构成一个复合控件。
内容:
内容:
重载CreateChildControls方法,添加我们自己的控件
重载CreateChildControls方法,添加我们自己的控件
protected override void CreateChildControls()
{
//清除创建的控件
Controls.Clear();
//清除视图状态
ClearChildViewState();
//创建controls
CreateCtrls();
}
下面是CreateCtrls()的实现方法:
下面是CreateCtrls()的实现方法:
private void CreateCtrls()
{
ScritpBlock();
this.Attributes ["style"]=this.Style.ToString();
System.Web.UI.WebControls.ImageButton image =new System.Web.UI.WebControls.ImageButton();
if(ImageStyle !=string.Empty )
{
image.Attributes["Style"]=ImageStyle ;
}
image.ImageUrl =ImageUrl ;
image.Attributes["style"]=string.Format("filter:alpha(opacity={0})",Alpha );//style="filter:alpha(opacity=20)"
image.ImageAlign =ImageAlign.AbsMiddle ;
image.ToolTip =this.ToolTip;
LinkButton button=new LinkButton ();
if(OnClickScript.Trim()!="") //附加执行脚本程序的功能
{
image.Attributes["onclick"] =OnClickScript ;
button.Attributes["onclick"]= OnClickScript ;
}
this.Attributes["onmouseover"]="imagebuttonmouseover(this)";
this.Attributes["onmouseover"]="imagebuttonmouseover(this)";
this.Attributes["onmouseout"]="imagebuttonmouseout(this)";
image.Attributes["onmouseover"]="imagebuttonmouseover(this)";
image.Attributes["onmouseout"]="imagebuttonmouseout(this)";
button.Text = this.Text ;
this.Attributes["style"]=string.Format("filter:alpha(opacity={0})",Alpha );
this.ToolTip =this.ToolTip ;
image.Click+=new ImageClickEventHandler(image_Click);
button.Click +=new EventHandler(button_Click);
if(Direction ==方向.横向 )
{
BuildHorizontal(image,button);
}
else
{
BuildVertical (image,button);
}
}
从上面我们创建了一个ImageButton控件和一个Button控件,这两个控件各自有自己的事件,如何和我们的WebImageButton事件进行挂钩呢,那么我们就需要对WebImageButton控件创建一个新的事件。方法如下:
那我们先定义一个事件的类,
public class ImageButtonEventArgs :EventArgs
{
public string ImageUrl;
public string Text;
}
接着在WebImageButton类中注册该事件
#region Event
public delegate void ImageButtonClickEventHandler(object sender,ImageButtonEventArgs e);
public event ImageButtonClickEventHandler ImageButtonClick;
public virtual void OnImageButtonClick(ImageButtonEventArgs e)
{
if(ImageButtonClick!=null){
ImageButtonClick(this,e);
}
}
#endregion
最后我们再在WebImageButton类的image_Click事件中触发该事件,这样的话就将复合控件中的控件和整个控件的事件关联起来了。
private void image_Click(object sender, ImageClickEventArgs e)
{
ImageButtonEventArgs et=new ImageButtonEventArgs();
et.Text =this.Text;
et.ImageUrl =imageUrl ;
OnImageButtonClick(et);
OnImageButtonClick(et);
this.DataBind();
}
到此控件创建完成,最后一步重载Render方法,实现编辑状态下效果
到此控件创建完成,最后一步重载Render方法,实现编辑状态下效果
protected override void Render(HtmlTextWriter output)
{
if (Site != null && Site.DesignMode)
CreateChildControls();
base.Render(output);
}
技术中国 提供代码下载