选择显示字体大小

web组件的通信---浅谈事件

大家目前开发asp.net程序经常会用到usercontrols即pagelet(.ascx文件)。有不少人现在把它当做asp里的include来使用。当然这也是很自然的,但一旦考虑到user controls和他所处的容器web form之间或其他user controls之间的通信,事情好像就比较复杂了。比如说,我有这样一个页面
user control(image button)
user control(left hyperlink menu) user control(main content) user control(advertisments)
user control(additional links)
如果你想要在点击左面的link时,让container动态的调用一个新的user control到main content的位置,这就要求我们给这两个web组件定位:
1.parent web form:应该知晓页面中他所有load的user controls传递给他的的布局和导航消息
2.user control:向parent web form传递消息
拿上面的例子说,parent web form怎样才知道你什么时候点击了left hyperlink menu中的一个link,或者parent web form怎样才知道你点击了哪一个link?很明显我们应该提供一个通信机制,而.net framework已经提供了这样一套机制--event。(当然上面的例子可以用response.redirect和request.params来解决,但这不是一个最优的解决方案,因为这种机制是紧密耦合的,而一个好的组件是应该有高度独立性的,我以前也说过事件是松散耦合的机制)
现在我们来先看一段代码
using system;
using system.web.ui.webcontrols;

namespace michael.communication.usercontrols.delegates
{
using evengargobjects;
// 声明delegate(注意delegate其实是个对象),在c#中一般是(object sender, eventargs e),sender是引发事件的对象的例示
//比如说在一个user control中有一个button引发了一个事件,那button就是sender,而不是user control
//delegate既可以在class之外声明也可以在class之内声明,一般在class之外声明
public delegate void headereventhandler(object sender, michaelimageeventargs e);
}

namespace michael.communication.usercontrols.delegates.eventargobjects
{
// 继承system.eventargs,当单击图形按钮时提供信息
public class michaelimageeventargs : system.eventargs
{
private string imagetextclicked = null;

public string imagetext
{
get {return imagetextclicked;}
set {imagetextclicked = value.trim();}
}
}
}
注:上面的代码实现了我们自己的delegate和eventargs

接下来我们写一个user control,包含六个image button
//header.ascx
<%@ control language="c#" autoeventwireup="false" codebehind="header.ascx.cs" inherits="michael.communication.usercontrols.header"%>
<asp:table runat="server" cellspacing="0" cellpadding="0" id="table1">
<asp:tablerow runat="server">
<asp:tablecell runat="server">
<asp:table border="0" cellspacing="0" cellpadding="0">
<asp:tablerow id="row1" runat="server">
<asp:tablecell runat="server" columnspan="2" horizontalalign="left">
<asp:imagebutton id="imgnewlogo" runat="server" imageurl="images/newlogo.gif" onclick="image_click" />
</asp:tablecell>
<asp:tablecell runat="server" columnspan="4" horizontalalign="right">
<asp:imagebutton id="imgnewhead" runat="server" imageurl="images/newhead.gif" onclick="image_click" />
</asp:tablecell>
</asp:tablerow>
<asp:table>
<asp:tablerow id="row2" runat="server">
<asp:tablecell runat="server">
<asp:imagebutton id="imgbanner1" runat="server" imageurl="images/banner1.gif" onclick="image_click" />
</asp:tablecell>
<asp:tablecell runat="server">
<asp:imagebutton id="imgbanner2" runat="server" imageurl="images/banner2.gif" onclick="image_click" />
</asp:tablecell>
<asp:tablecell runat="server">
<asp:imagebutton id="imgbanner3" runat="server" imageurl="images/banner3.gif" onclick="image_click" />
</asp:tablecell>
<asp:tablecell runat="server">
<asp:imagebutton id="imgbanner4" runat="server" imageurl="images/banner4.gif" onclick="image_click" />
</asp:tablecell>
</asp:tablerow>
</asp:table>
</asp:tablecell>
</asp:tablerow>
</asp:table>

//header.ascx.cs
namespace michael.communication.usercontrols
{
using system;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
using michael.communication.usercontrols.delegates;
using michael.communication.usercontrols.delegates.eventargobjects;

public abstract class header : system.web.ui.usercontrol
{
// 声明事件(触发事件相当于回调)
public event headereventhandler headereventhandler;

public void image_click(object sender, imageclickeventargs e)
{
if(headereventhandler != null)
{
imagebutton ib = (imagebutton)sender;
// 创建evenargs对象的实例
michaelimageeventargs michaelimageeventargs = new michaelimageeventargs();
michaelimageeventargs.imagetextclicked = getimagebuttontext(ib.id, e);

foreach(headereventhandler h in headereventhandler.getinvocationlist())
{
try
{
// 事件触发
h(ib, michaelimageeventargs);
}
catch (exception er)
{
// 处理意外
}
}
}
return;
}

//用imagebutton的imageclickeventargs返回x,y确定点击到图片的那一部分
private string getimagebuttontext(string id, imageclickeventargs e)
{
string returnvalue = null;

if(id == "imgnewlogo")
returnvalue = "ibm";

if(id == "imgnewhead")
{
if((e.y > 0) && (e.y < 35))
returnvalue = "163.com";
else
returnvalue = "microsoft";
}

if(id == "imgbanner1")
returnvalue = "8488";

if(id == "imgbanner2" id == "imgbanner3")
{
if((e.y > 0) && (e.y < 21))
returnvalue = "chinabyte";
if((e.y > 20) && (e.y < 36))
returnvalue = "www";
if(e.y > 35)
returnvalue = (id == "imgbanner2" ? "sina.com.cn" : "5460.net");
if(e.x > 160)
returnvalue = (id == "imgbanner2" ? "my name is michael" : "what is your name");
}

if(id == "imgbanner4")
{
if((e.y > 0) && (e.y < 36))
returnvalue = "@163.com";
if(e.y > 35)
returnvalue = "www.163.com";
}
return returnvalue;
}
}
}

主页面
//default.aspx
<%@ page language="c#" codebehind="default.aspx.cs" autoeventwireup="false" inherits="michael.communication.default" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
<head><title>事件例子</title></head>
<body>
<form runat="server">
<asp:table id="tbllayout" runat="server" cellspacing="0" cellpadding="0">
<asp:tablerow id="row1" runat="server">
<asp:tablecell id="cell11" runat="server"></asp:tablecell>
</asp:tablerow>
<asp:tablerow id="row2" runat="server">
<asp:tablecell id="celltest1" runat="server"
text="你选择的图片所对应的文字是:(第一次事件被触发)"
font-name="verdana" font-size="11pt" backcolor="gainsboro" borderstyle="solid"
borderwidth="1px" bordercolor="black" horizontalalign="center" />
</asp:tablerow>
<asp:tablecell id="celltest2" runat="server"
text="你选择的图片所对应的文字是:(第二次事件被触发)"
font-name="verdana" font-size="11pt" backcolor="gainsboro" borderstyle="solid"
borderwidth="1px" bordercolor="black" horizontalalign="center" />
</asp:tablerow>
</asp:table>
</form>
</body>
</html>

//default.aspx.cs
using system;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
using michael.communication.usercontrols;
using michael.communication.usercontrols.delegates;
using michael.communication.usercontrols.delegates.eventargobjects;

namespace michael.communication
{
public class default : system.web.ui.page
{
protected system.web.ui.webcontrols.tablecell cell11;
protected system.web.ui.webcontrols.tablecell celltest1;
protected system.web.ui.webcontrols.tablecell celltest2;

public default()
{
page.init += new system.eventhandler(page_init);
}

private void page_init(object sender, eventargs e)
{
initializecomponent();
}

private void initializecomponent()
{
this.load += new system.eventhandler(this.page_load);
}

private void page_load(object sender, system.eventargs e)
{
cell11.controls.add(loadheader());
}

//触发事件
public void settext1(object sender, michaelimageeventargs e)
{
celltest1.text = "你选择的图片所对应的文字是: <b>{" + e.imagetext + "}</b>";
}

//触发事件
public void settext2(object sender, michaelimageeventargs e)
{
celltest2.text = "你选择的图片所对应的文字是: <b>{" + e.imagetext + "}</b>";
}

private header loadheader()
{
header header = (header)page.loadcontrol("header.ascx");
//事件关联
header.headereventhandler += new headereventhandler(this.settext1);
header.headereventhandler += new headereventhandler(this.settext2);
return header;
}

}
}  


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons