事件处理研究笔记(技术)

引子

如何手动绑定服务对象的事件处理(一)
无知的猜试:


//事件处理方法(单页情况)
//两个对象的事件处理:WebForm加载事件和LinkButton的单击事件

< script runat = server >
    
void  Page_Load() 
    
{
        lblMsg.Text 
= Request.QueryString["Message"];
        lbtReturn.PostBackUrl 
= Request.ServerVariables["SCRIPT_NAME"];
    }

    
void  ReturnPrePage() 
    
{
    
    }

        
</ script >


 
//对象声明

< form  runat ="server"  onload =Page_Load >
...
< asp:LinkButton  ID ="lbtReturn"  runat ="server"  OnClick ="ReturnPrePage" > 返回 </ asp:LinkButton ></ td >


//运行结果:事件委托似乎没有与事件处理“挂勾”
Error 1 No overload for 'ReturnPrePage' matches delegate 'System.EventHandler'
D:/lidodo.net/Lidodo.Web/Lidodo.Web.Website/home/Message.aspx 58
Error 2 No overload for 'Page_Load' matches delegate 'System.EventHandler'
D:/lidodo.net/Lidodo.Web/Lidodo.Web.Website/home/Message.aspx 24
 
分析原因:
我说事件委托没有与事件处理“挂勾”是很对的,挂接代码的确没有。但直接用IDE编写控件的事件也是没有显示的挂接,这就给初学都一种错误的导向,以为事件处理就是那么一回事,事实却是IDE神鬼不觉的做了手脚。
问题出在哪儿?
问题出在对象的生命期我们把握不定。我们不知道在什么地方可以看见对象,然后对其进行事件处理的挂接。
 
抽象
事件触发对象sender和事件参数EventArgs 从何而来的?
事件是委托使用的一特殊例子,再加上ASP.NET的声明式编程,这两个搞得你头晕脑转了。好好再研究一下。
委托的前身是函数指针,也是就动态调用。
事件是一个比较特别的概念。

声明式绑定:

     < asp:DataGrid  id ="dgProblems"  runat ="server"
                 BorderColor
="#000080"  BorderWidth ="2px"
                 AutoGenerateColumns
="False"
                 HorizontalAlign
="center"
                 Width
="90%"
                 OnCancelCommand
="dgProblems_CancelCommand"
                 OnEditCommand
="dgProblems_EditCommand"
                 OnUpdateCommand
="dgProblems_UpdateCommand" >


编程式绑定:

             this .dgAllClm.CancelCommand  +=   new  System.Web.UI.WebControls.DataGridCommandEventHandler( this .dgAllClm_CancelCommand);
            
this .dgAllClm.EditCommand  +=   new  System.Web.UI.WebControls.DataGridCommandEventHandler( this .dgAllClm_EditCommand);
            
this .dgAllClm.UpdateCommand  +=   new  System.Web.UI.WebControls.DataGridCommandEventHandler( this .dgAllClm_UpdateCommand);
            
this .dgAllClm.DeleteCommand  +=   new  System.Web.UI.WebControls.DataGridCommandEventHandler( this .dgAllClm_DeleteCommand);


gridview的排序事件处理方法(虚的)

         protected   virtual   void  OnSorted(EventArgs e);
        
protected   virtual   void  OnSorting(GridViewSortEventArgs e);

gridview的排序事件(有手柄类型?)

         public   event  EventHandler Sorted;
        
public   event  GridViewSortEventHandler Sorting;

排序事件手柄GridViewSortEventHandler(一个委托,有一个事件参数类型

     public   delegate   void  GridViewSortEventHandler( object  sender, GridViewSortEventArgs e);

事件参数类型GridViewSortEventArgs (参数有排序方向和排序表达式,类继承自CancelEventArgs)

     public   class  GridViewSortEventArgs : CancelEventArgs
    
{
        
public GridViewSortEventArgs(string sortExpression, SortDirection sortDirection);

        
public SortDirection SortDirection getset; }
        
public string SortExpression getset; }
    }


CancelEventArgs

     public   class  CancelEventArgs : EventArgs
    
{
        
public CancelEventArgs();
        
public CancelEventArgs(bool cancel);

        
public bool Cancel getset; }
    }


EventArgs

using  System.Runtime.InteropServices;

namespace  System
{
    [Serializable]
    [ComVisible(
true)]
    
public class EventArgs
    
{
        
public static readonly EventArgs Empty;

        
public EventArgs();
    }

}

 


回调说白了就是一般客户对象调用服务对象反向,即服务对象(使用某种机制,如事件)反过来通知或调用客户执 行任务。
这个还好理解,加了个委托(特殊委托—事件)搞到你“神魂颠倒”。在这个服务控件被触发的情景中,我们看到,事件是GridView的事件,执行任务是页面类执行任务。如:

         void  this_Sorting( object  sender, GridViewSortEventArgs e)
        
{
            
string sSortDirection;
            
this.CurrentSortExpression = e.SortExpression;
            
if (this.CurrentSortDirection == SortDirection.Ascending)
            
{
                
this.CurrentSortDirection = SortDirection.Descending;
                sSortDirection 
= " DESC";
            }

            
else
            
{
                
this.CurrentSortDirection = SortDirection.Ascending;
                sSortDirection 
= " ASC";
            }


            LoadData(e.SortExpression, sSortDirection);
        }

 

这个方法正名应该只是页面类的成员方法,只不过它用来处理事件服务对象GridView排序事件罢了,不信?看看挂代码:

             this .Sorting  +=  this_Sorting;

我们看看这个Sorting事件的定义:
        public event GridViewSortEventHandler Sorting;
哦,类型event 和名字Sorting之 间有一个处理手柄,它是什么?它就是委托。就是定义处理本事件的手柄的原型。看看它的定义:
    public delegate void GridViewSortEventHandler(object sender, GridViewSortEventArgs e);
看到了,这就是委托,看看它的方法参数与事件处理方法this_Sorting(object sender, GridViewSortEventArgs e)是一样的,这样就可以“委托”了。
 

你可能感兴趣的:(object,datagrid,server,String,webform,sorting)