当前位置:编程学习 > C#/ASP.NET >>

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

答案: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.GetInvocation

上一个:图象显示和翻转控件(用户自定义控件)--我也来凑凑热闹--(转)
下一个:Using DropDownList control in DataGrid

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,