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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值