前两篇介绍了服务器控件的基本显示,属性的设定,继承Webcontrol开发控件等内容,这篇介绍下定制服务器控件的事件的处理和回传数据的处理。
  
  
    
      当
    
    ASP.NET
    
      页面处理回传到服务器端的表单时,两种信息会传递给页面中的控件:
    
  
  
    
      回传事件,如
    
    Button
    
      一类控件触发的回传,会引发服务器端事件;
    
  
  
    
      回传数据:是
    
    Web
    
      表单中包含的数据,该数据是在
    
    Web
    
      表单提交到服务器端时传递给如
    
    TextBox
    
      一类的控件。
    
  
  
    
      处理回传数据
    
  
  
    PostBack(回传):ASP.NET控件提交表单到服务器端,将信息从浏览器传递到服务器端的过程。
  
  
    我们可能经常会在Page_Load事件中写这样的代码:
  
  
    
  <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 
 
    
      protected
    
    
    
    
      void
    
    
      Page_Load(
    
    
      object
    
    
      sender,EventArgse)
      
      {
      
    
    
      if
    
    
      (
    
    
      !
    
    
      IsPostBack)
      
      {
      
       
       .
      .
      
      }
      
      }
    
  
    但是初学的时候我们很少回去问,为什么要写这段代码,只知道这么写就是对的。其实这就是数据回传的一个表现,通过该值指示该页是否正为响应客户端回发而加载。
  
  
    
      ASP.ENT服务器控件处理回传数据,基本上完成以下两个工作:
    
  
  
    
      -->继承并实现IPostBackDataHandler接口的 
    
  
  
    -->实现RaisePostDataChangedEvent方法,处理回发数据
  
  
    通过例子说明一下,这里创建一个自己的文本框:创建一个ASP.NET服务器控件项目(MyTextBox)
  
  
     
     Code
    
      Code
    
    
      
      <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
      
        namespace
      
      
        NewTextBox
        
        {
        
        [DefaultProperty(
      
      
        "
      
      
        Text
      
      
        "
      
      
        )]
        
        [ToolboxData(
      
      
        "
      
      
        <{0}:NewTextBoxrunat=server></{0}:NewTextBox>
      
      
        "
      
      
        )]
        
      
      
        public
      
      
      
      
        class
      
      
        NewTextBox:WebControl,IPostBackDataHandler
        
        {
        
      
      
        public
      
      
      
      
        event
      
      
        EventHandlerTextChanged;
        
        
      
      
        public
      
      
      
      
        string
      
      
        ViewText
      
      
        //
      
      
        定义显示文字属性
      
      
        
      
      
        {
        
      
      
        get
      
      
        
        {
        
      
      
        if
      
      
        (ViewState[
      
      
        "
      
      
        Text
      
      
        "
      
      
        ].Equals(
      
      
        null
      
      
        ))
        
        {
        
      
      
        return
      
      
        String.Empty;
        
        }
        
      
      
        else
      
      
        
        {
        
      
      
        return
      
      
        ViewState[
      
      
        "
      
      
        Text
      
      
        "
      
      
        ].ToString();
        
        }
        
        }
        
      
      
        set
      
      
        
        {
        
        ViewState[
      
      
        "
      
      
        Text
      
      
        "
      
      
        ]
      
      
        =
      
      
        value;
        
        }
        
        }
        
        
      
      
        protected
      
      
      
      
        override
      
      
        HtmlTextWriterTagTagKey
      
      
        //
      
      
        向页面中添加文本框
      
      
        
      
      
        {
        
      
      
        get
      
      
        
        {
        
      
      
        return
      
      
        HtmlTextWriterTag.Input;
        
        }
        
        }
        
        
      
      
        protected
      
      
      
      
        override
      
      
      
      
        void
      
      
        AddAttributesToRender(HtmlTextWriterwriter)
        
        {
        
        writer.AddAttribute(HtmlTextWriterAttribute.Type,
      
      
        "
      
      
        text
      
      
        "
      
      
        );
        
        writer.AddAttribute(HtmlTextWriterAttribute.Value,ViewText);
        
        writer.AddAttribute(HtmlTextWriterAttribute.Name,
      
      
        this
      
      
        .UniqueID);
        
        
      
      
        base
      
      
        .AddAttributesToRender(writer);
        
        }
        
        
      
      
        public
      
      
      
      
        bool
      
      
        LoadPostData(
      
      
        string
      
      
        postDataKey,System.Collections.Specialized.NameValueCollectionpostCollection)
      
      
        //
      
      
        表单域的值和控件的ViewText(此示例中)属性的当前值不匹配,那么将新的值赋给ViewText属性,并且返回True。只有当LoadPostData返回True的时候,才会调用RaisePostDataChangedEvent方法。
      
      
        
      
      
        
        {
        
      
      
        if
      
      
        (postCollection[postDataKey]
      
      
        !=
      
      
        ViewText)
        
        {
        
        ViewText
      
      
        =
      
      
        postCollection[postDataKey];
        
      
      
        return
      
      
      
      
        true
      
      
        ;
        
        }
        
      
      
        return
      
      
      
      
        false
      
      
        ;
        
        }
        
        
      
      
        public
      
      
      
      
        void
      
      
        RaisePostDataChangedEvent()
        
        {
        
      
      
        if
      
      
        (TextChanged
      
      
        !=
      
      
      
      
        null
      
      
        )
        
        TextChanged(
      
      
        this
      
      
        ,EventArgs.Empty);
        
        }
        
        
        }
        
        }
      
    
   
  
    测试一下:
  
  
    
  <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 
 
    
      protected
    
    
    
    
      void
    
    
      Button1_Click(
    
    
      object
    
    
      sender,EventArgse)
      
      {
      
      Label1.Text
    
    
      =
    
    
      NewTextBox1.ViewText;
      
      }
    
  
  
    只有当文本框中是文字发生变化是,才会引起数据的回发并从新获得数据。(控件拖到页面时,要给viewText赋值)
  
  
    
      
        处理回发事件
      
    
  
  
    ASP.NET服务器控件处理回发事件,基本上需要完成以下两个工作:
  
  
    -->继承并实现IPostBackEventHandler接口的 
  
  
    -->实现RaisePostBackEvent方法,处理回发事件
  
  
    Button控件继承IPostBackEventHandler接口(所有的按钮控件,ImageButton,LinkButtton都继承了这个接口)。IPostBackEventHandler接口专门定义了处理回发事件的方法,如果自定义控件需要处理回发事件,你就需要继承IPostBackEventHandler接口。
  
  
    通过例子说明一下,这里我们定制一个自己的按钮:创建一个ASP.NET服务器控件项目(MyButton)
  
  
     
     Code
    
      Code
    
    
      
      <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
      
        namespace
      
      
        MyButton
        
        {
        
        [DefaultProperty(
      
      
        "
      
      
        Text
      
      
        "
      
      
        )]
        
        [ToolboxData(
      
      
        "
      
      
        <{0}:MyButtonrunat=server></{0}:MyButton>
      
      
        "
      
      
        )]
        
      
      
        public
      
      
      
      
        class
      
      
        MyButton:WebControl,IPostBackEventHandler
        
        {
        
      
      
        private
      
      
      
      
        static
      
      
      
      
        readonly
      
      
      
      
        object
      
      
        ClickKey
      
      
        =
      
      
      
      
        new
      
      
      
      
        object
      
      
        ();
        
        
      
      
        public
      
      
      
      
        event
      
      
        EventHandlerClick
      
      
        //
      
      
        定义事件的委托
      
      
        
      
      
        {
        
        add
        
        {
        
        Events.AddHandler(ClickKey,value);
        
        }
        
        remove
        
        {
        
        Events.RemoveHandler(ClickKey,value);
        
        }
        
        }
        
        
      
      
        protected
      
      
      
      
        virtual
      
      
      
      
        void
      
      
        OnClick(EventArgse)
      
      
        //
      
      
        定义单击事件的处理程序
      
      
        
      
      
        {
        
        EventHandlerclickEventDelegate
      
      
        =
      
      
        (EventHandler)Events[ClickKey];
        
        
      
      
        if
      
      
        (clickEventDelegate
      
      
        !=
      
      
      
      
        null
      
      
        )
        
        {
        
        clickEventDelegate(
      
      
        this
      
      
        ,e);
        
        }
        
        }
        
        
      
      
        public
      
      
      
      
        void
      
      
        RaisePostBackEvent(
      
      
        string
      
      
        eventArgument)
      
      
        //
      
      
        处理回发事件
      
      
        
      
      
        {
        
        OnClick(
      
      
        new
      
      
        EventArgs());
        
        }
        
        
      
      
        protected
      
      
      
      
        override
      
      
      
      
        void
      
      
        RenderContents(HtmlTextWriteroutput)
        
        {
        
        output.Write(
      
      
        "
      
      
        <INPUTTYPE=submitname=
      
      
        "
      
      
      
      
        +
      
      
      
      
        this
      
      
        .UniqueID
      
      
        +
      
      
        
      
      
        "
      
      
        Value='这是自己定制的按钮!'/>
      
      
        "
      
      
        );
        
        }
        
        }
        
        }
        
      
    
   
  
    测试一下:
  
  
    
  <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 
 
    
      protected
    
    
    
    
      void
    
    
      MyButton1_Click(
    
    
      object
    
    
      sender,EventArgse)
      
      {
      
      Label1.Text
    
    
      =
    
    
    
    
      "
    
    
      HelloWorld!!!!!!!!!
    
    
      "
    
    
      ;
      
      }
    
  
  
    按钮的事件回发处理成功。
  
  
    
    
      
        客户端回发事件
      
    
  
  
    在asp.net2.0中,Button 控件多了一个UseSubmitBehavior 属性,指示 Button 控件使用客户端浏览器的提交机制(客户端回发)还是 ASP.NET 回发机制,默认采用ASP.NET回发机制,如果设置为false的话,则需要调用GetPostBackEventReference 方法来返回 Button 的客户端回发事件。
  
  
    当设置UseSubmitBehavior 属性为flase时,运行页面时,则会发现一段自动生成的javascript代码(查看源文件)
  
  
     
     Code
    
      Code
    
    
      
      <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
      
        <
      
      
        scripttype
      
      
        =
      
      
        "
      
      
        text/javascript
      
      
        "
      
      
        >
      
      
        
      
      
        //
      
      
        <![CDATA[
      
      
        
      
      
        var
      
      
        theForm
      
      
        =
      
      
        document.forms[
      
      
        '
      
      
        form1
      
      
        '
      
      
        ];
        
      
      
        if
      
      
        (
      
      
        !
      
      
        theForm){
        
        theForm
      
      
        =
      
      
        document.form1;
        
        }
        
      
      
        function
      
      
        __doPostBack(eventTarget,eventArgument){
        
      
      
        if
      
      
        (
      
      
        !
      
      
        theForm.onsubmit
      
      
        ||
      
      
        (theForm.onsubmit()
      
      
        !=
      
      
      
      
        false
      
      
        )){
        
        theForm.__EVENTTARGET.value
      
      
        =
      
      
        eventTarget;
        
        theForm.__EVENTARGUMENT.value
      
      
        =
      
      
        eventArgument;
        
        theForm.submit();
        
        }
        
        }
        
      
      
        //
      
      
        ]]>
      
      
        
      
      
        <
      
      
        /
      
      
        script>
      
    
   
  
    这里我们创建一个按钮,根据属性的设定,更改其事件回发的方式:
  
  
     
     Code
    
      Code
    
    
      
      <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
      
        namespace
      
      
        MyLinkButton
        
        {
        
        [DefaultProperty(
      
      
        "
      
      
        Text
      
      
        "
      
      
        )]
        
        [ToolboxData(
      
      
        "
      
      
        <{0}:MyLinkButtonrunat=server></{0}:MyLinkButton>
      
      
        "
      
      
        )]
        
      
      
        public
      
      
      
      
        class
      
      
        MyLinkButton:WebControl,IPostBackEventHandler
        
        {
        
      
      
        public
      
      
      
      
        virtual
      
      
        ButtonDisplayDisplay
        
        {
        
      
      
        get
      
      
        
        {
        
      
      
        object
      
      
        display
      
      
        =
      
      
        ViewState[
      
      
        "
      
      
        Display
      
      
        "
      
      
        ];
        
      
      
        if
      
      
        (display
      
      
        ==
      
      
      
      
        null
      
      
        )
        
      
      
        return
      
      
        ButtonDisplay.Button;
        
      
      
        else
      
      
        
      
      
        return
      
      
        (ButtonDisplay)display;
        
        }
        
      
      
        set
      
      
        
        {
        
        ViewState[
      
      
        "
      
      
        Display
      
      
        "
      
      
        ]
      
      
        =
      
      
        value;
        
        }
        
        }
        
        
      
      
        public
      
      
      
      
        virtual
      
      
      
      
        string
      
      
        Text
        
        {
        
      
      
        get
      
      
        
        {
        
      
      
        object
      
      
        text
      
      
        =
      
      
        ViewState[
      
      
        "
      
      
        Text
      
      
        "
      
      
        ];
        
      
      
        if
      
      
        (text
      
      
        ==
      
      
      
      
        null
      
      
        )
        
      
      
        return
      
      
      
      
        string
      
      
        .Empty;
        
      
      
        else
      
      
        
      
      
        return
      
      
        (
      
      
        string
      
      
        )text;
        
        }
        
      
      
        set
      
      
        
        {
        
        ViewState[
      
      
        "
      
      
        Text
      
      
        "
      
      
        ]
      
      
        =
      
      
        value;
        
        }
        
        }
        
        
      
      
        private
      
      
      
      
        static
      
      
      
      
        readonly
      
      
      
      
        object
      
      
        ClickKey
      
      
        =
      
      
      
      
        new
      
      
      
      
        object
      
      
        ();
        
        
      
      
        public
      
      
      
      
        event
      
      
        EventHandlerClick
      
      
        //
      
      
        定义委托
      
      
        
      
      
        {
        
        add
        
        {
        
        Events.AddHandler(ClickKey,value);
        
        }
        
        remove
        
        {
        
        Events.RemoveHandler(ClickKey,value);
        
        }
        
        }
        
        
      
      
        protected
      
      
      
      
        virtual
      
      
      
      
        void
      
      
        OnClick(EventArgse)
      
      
        //
      
      
        定义Click事件处理函数
      
      
        
      
      
        {
        
        EventHandlerclickEventDelegate
      
      
        =
      
      
        
        (EventHandler)Events[ClickKey];
        
      
      
        if
      
      
        (clickEventDelegate
      
      
        !=
      
      
      
      
        null
      
      
        )
        
        {
        
        clickEventDelegate(
      
      
        this
      
      
        ,e);
        
        }
        
        }
        
        
      
      
        public
      
      
      
      
        void
      
      
        RaisePostBackEvent(
      
      
        string
      
      
        argument)
        
        {
        
        
        OnClick(EventArgs.Empty);
        
        }
        
        
      
      
        override
      
      
      
      
        protected
      
      
      
      
        void
      
      
        Render(HtmlTextWriterwriter)
        
        {
        
      
      
        base
      
      
        .Render(writer);
        
        Page.VerifyRenderingInServerForm(
      
      
        this
      
      
        );
        
        
      
      
        if
      
      
        (Display
      
      
        ==
      
      
        ButtonDisplay.Button)
        
        {
        
        writer.Write(
      
      
        "
      
      
        <INPUTtype=\
      
      
        "
      
      
        submit\
      
      
        ""
      
      
        );
        
        writer.Write(
      
      
        "
      
      
        name=\
      
      
        ""
      
      
        +this.UniqueID+
      
      
        "
      
      
        \
      
      
        ""
      
      
        );
        
        writer.Write(
      
      
        "
      
      
        id=\
      
      
        ""
      
      
        +this.UniqueID+
      
      
        "
      
      
        \
      
      
        ""
      
      
        );
        
        writer.Write(
      
      
        "
      
      
        value=\
      
      
        ""
      
      
        +Text+
      
      
        "
      
      
        \
      
      
        ""
      
      
        );
        
        writer.Write(
      
      
        "
      
      
        />
      
      
        "
      
      
        );
        
        }
        
      
      
        else
      
      
      
      
        if
      
      
        (Display
      
      
        ==
      
      
        ButtonDisplay.Hyperlink)
        
        {
        
        writer.Write(
      
      
        "
      
      
        <Ahref=\
      
      
        ""
      
      
        );
      
      
        
      
      
        writer.Write(Page.ClientScript.GetPostBackClientHyperlink(
      
      
        this
      
      
        ,
      
      
        ""
      
      
        ));
        
        writer.Write(
      
      
        "
      
      
        \
      
      
        "
      
      
        >
      
      
        "
      
      
        +Text+
      
      
        "
      
      
        </
      
      
        A
      
      
        >
      
      
        "
      
      
        );
      
      
        
      
      
        }
        
        }
        
        
      
      
        public
      
      
      
      
        enum
      
      
        ButtonDisplay
        
        {
        
        Button
      
      
        =
      
      
      
      
        0
      
      
        ,
        
        Hyperlink
      
      
        =
      
      
      
      
        1
      
      
        
        }
        
        
        }
        
        
        
        }
      
    
   
  
    根据属性Display的属性的设置,对事件的回发进行控制,如果是Hyperlink则是客户端回发机制。
  
  
    小结:新手在对事件的回发上可能会迷糊,但是不要紧,慢慢的理解。简单的理解事件的回发就是我们点击一个按钮发生的事件,而这个事件的处理ASP.NET给我们提供了两种方式。更多ASP.NET服务器控件事件可以参考:
  
  
    
      http://msdn.microsoft.com/zh-cn/library/cc437696(VS.71).aspx
    
  
  
    
      http://msdn.microsoft.com/zh-cn/library/xax2hw3x.aspx
    
  
  
    写的不好,希望能对新手有帮助。
  
  
    
      ASP.NET服务器控件开发(3)--事件和回传数据的处理