大家目前开发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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器