zoukankan      html  css  js  c++  java
  • 自定义控件基础2

    Control类程序按控件的步骤:

    呈现控件的步骤

    1.RenderControl方法

    代码如下:

    protected void RenderControl(HtmlTextWriter writer)

    {

    if(Visible)

    {

    Render(writer);
    }

    }

    先判断Visible,然后进行Render.

    2.Render方法

    public virtual void Render(HtmlTextWriter writer)

    {

    RenderChildren(writer);

    }

    使用HtmlTextWriter将标记字符和文本输出,然后调用RenderChildren方法.

    3.RenderChildren方法

    public virtual void RenderChildren(HtmlTextWriter writer)

    {

    for(Control c in Controls)

    {

    c.RenderControl(writer);

    }

    }

    判断当前控件是否有子控件,然后调用RenderControl方法,根据子控件的visible值输出子控件.

    下面来看一下控件的事件处理.

    1.我们知道Button有一个Click事件,我们打开vs,导航至Button的定义,可以看到如下:

    public class Button : WebControl, IButtonControl, IPostBackEventHandler
    {
    }

    其中IPostBackEventHandler接口是负责处理回发事件的.如果自定义空间需要处理回发事件,那么就实现该接口就可以了,我们查看该接口:

        // 摘要:
        //     定义 ASP.NET 服务器控件为处理回发事件而必须实现的方法。
        public interface IPostBackEventHandler
        {
            // 摘要:
            //     当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件。
            //
            // 参数:
            //   eventArgument:
            //     表示要传递到事件处理程序的可选事件参数的 System.String。
            void RaisePostBackEvent(string eventArgument);
        }

    在该接口的RaisePostBackEvent方法中,有一个参数,该参数表示的是要传递给处理程序的参数.

    处理回发事件的步骤如下:

    1.自定义服务器控件类必须实现IPostBackEventHandler接口,并实现该接口成员RaisePostBackEvent方法

    2.为表单定义UniqueID,以与IPostBackEventHandler服务器控件的UniqueID相对应.

    注意:只有为引起回传的控件的name属性分配了UniqueID,才能够正确实现捕获回传事件。

     例子如下:

        public class Btn : Control,IPostBackEventHandler
        {
            public event EventHandler click;
    
            public void RaisePostBackEvent(string eventArgument)
            {
                if (click != null)
                {
                    click(this, EventArgs.Empty);
                }
            }
    
            protected override void Render(HtmlTextWriter writer)
            {
                writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");
            }
        }

    页面调用:

        <cc1:Btn ID="Btn1" runat="server" onclick="Btn1_click">
        </cc1:Btn>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    
        protected void Btn1_click(object sender, EventArgs e)
        {
            Label1.Text = "点击事件!";
        }
    注意:
    EventArgs.Empty表示没有事件数据的事件,而不是表示空事件!
    此时,如果控件中存在多个时间,编译器将会为每一个事件委托生成一个字段,这样的效率是比较低的,可以采用另一种方式来对事件处理进行优化:
    我们可以使用EventHandlerList,该类有几个重要的方法,具体如下:
            public void AddHandler(object key, Delegate value);
            public void AddHandlers(EventHandlerList listToAddFrom);
            public void RemoveHandler(object key, Delegate value);
    示例:
        public class Btn : Control, IPostBackEventHandler
        {
            private static readonly object EventDBClick = new object();
    
            public event EventHandler DBClick
            {
                add
                {
                    Events.AddHandler(EventDBClick, value);
                }
                remove
                {
                    Events.RemoveHandler(EventDBClick, value);
                }
            }
            
            public void RaisePostBackEvent(string eventArgument)
            {
                OnDBClick(EventArgs.Empty);
            }
    
            protected virtual void OnDBClick(EventArgs e)
            {
                EventHandler handler = (EventHandler)Events[EventDBClick];
                if (handler != null)
                {
                    handler(this, e);
                }
            }
    
            protected override void Render(HtmlTextWriter writer)
            {
                writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");
            }
        }
  • 相关阅读:
    安装开发工具
    CSS基础
    CSS动画
    CSS效果
    CSS布局
    CSS预处理语言
    React开发笔记
    Vue2.0学习笔记
    Vue-cli3.0开发笔记
    项目开发技巧
  • 原文地址:https://www.cnblogs.com/oneword/p/1630962.html
Copyright © 2011-2022 走看看