C#事件

(正在写........)

=======================
一、从网页说起

一个页面里有一个按钮SimpleButton(就是一个只有能处理少量点击的Button)
cs CodeBehind如下 

public partial class _Default : System.Web.UI.Page
{
//Defaul.aspx.cs    
  protected   void  Page_Load( object  sender, EventArgs e)
    
{
        SimpleButton myButton;
           //事件绑定prepare111

        myButton.Click 
+= new EventHandler(myButton_Click);

    }

     //事件处理函数prepare222
    
void  myButton_Click( object  sender, EventArgs e)
    
{
        
throw new Exception("The method or operation is not implemented.");
    }
}

 下面是一个自定义控件,(是一个简化的Button) 


namespace  MyControls
{
    
public class SimpleButton : Control, IPostBackEventHandler
    
{
        
// 声明Click事件委托
     public event EventHandler Click;

        
// 事件引发222
        protected virtual void OnClick(EventArgs e)
        
{
                    //检查绑定333
            
if (Click != null)
            
{//事件处事444
                Click(
this, e);
            }

        }


        
// 处理回发“事件”----111
        public void RaisePostBackEvent(string eventArgument)
        
{
            OnClick(EventArgs.Empty);
        }

//呈现控件
        protected override void Render(HtmlTextWriter output)
        
{
            output.Write(
"<INPUT TYPE=submit name=" + this.UniqueID +
               
" Value='确定' />");
        }

    }

}

        当用户点击Button后,回发到服务器将按上述(SimpleButton类)111---222---333---444的过程去处理,而333是检查(.aspx.cs)prepare111,444是执行prepare222;

2、谁是sender,谁是receiver?

逻辑上可以认为所有过程都在两个类中进行:一个是发送者sender, 一个是订阅者receiver:上述sender类是SimpleButton;receiver类是页面(下面用Page);通常刚接触事件会认为sender是Page,从直观想想看,点击发生在页面上还是按钮上?

3、sender如何send,receiver为什么能够receive?     

即:为什么333能检查(.aspx)prepare111,444能是执行prepare222呢?

解释这个问题则先要理解委托。可以将委托理解为指向函数的指针,如下为C的指向数的指针。而事件委托与之形式上不同的是:委托以类的成员出现,实例化后就已完成指针声明了;显而易见,sender完成对委托“指针”的声明,引发时,检查“指针”是否为空;若不为空则调用函数;receive则将自已的事件处理函数的"赋“给“指针”;

void  main()
{
      
int max(int x,int y);//函数
      
int (*p) (int,int);//声明指向函数的指针
      p
=max;//给指针赋值

      
int a=1;
      
int b=2;
      
int result;
      result
= p(a,b);//指针调函数
}


int  max( int  x, int  y)
{
     
return x>y?x:y;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值