• 自定义控件的构建(7)


    在处理回传事件中,还需要考虑的因素就是事件参数和选项

    传递回传事件参数

    前面曾提到GetPostBackClientHyperlinkc(),可以为其提供一个可选参数,其在引发回传时从浏览器传到服务器,它的值传递到服务器的

    RaisePostBackEvent()中,这里实现的功能类似于GridView的分页功能,单击时显示某一页数据

     namespace HandlePostBack
    
     {   //传递回传事件参数
    
        public class HandlePostEventParamsControl : WebControl, IPostBackEventHandler
    
        {
    
            private string _controlToPage;
    
            public string ControlToPage
    
            {
    
                get { return _controlToPage; }
    
                set { _controlToPage = value; }
    
            }
    
         
    
            protected override void RenderContents(HtmlTextWriter writer)
    
            {
    
                GridView gridview = GetControlToPage();
    
                for (int i = 0; i < gridview.PageCount; i++)
    
                {
    
                    string eRef = Page.ClientScript.GetPostBackClientHyperlink(this, i.ToString());
    
                    writer.Write("[");
    
                    if (i == gridview.PageIndex)
    
                    {
    
                        writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight, "bold");
    
                    }
    
                    writer.AddAttribute(HtmlTextWriterAttribute.Href, eRef);
    
                    writer.RenderBeginTag(HtmlTextWriterTag.A);
    
                    writer.Write("{0}", i + 1);
    
                    writer.RenderEndTag();
    
                    writer.Write("] ");
    
                }
    
            }
    
            private GridView GetControlToPage()
    
            {
    
                if (String.IsNullOrEmpty(_controlToPage))
    
                {
    
                    throw new Exception("Must set control property");
    
                }
    
                return (GridView)Page.FindControl(_controlToPage);
    
            }
    
            public void RaisePostBackEvent(string eventArgument)
    
            {
    
                GridView gridview = GetControlToPage();
    
                gridview.PageIndex = Int32.Parse(eventArgument);
    
            }
    
     }   }

    测试部分的主要代码

     <div>
    
        <handleps:HandlePostEventParamsControl ID="ParamsControl1" ControlToPage="GridView1" runat="server" />
    
            <asp:GridView ID="GridView1" DataSourceID="SQL1" runat="server"  AllowPaging="True" PageSize="2" PagerSettings-Visible="false">      
    
            </asp:GridView>
    
     </div>
    当页面呈现在浏览器时,生成类似下面的链接
    [<a href=”javascript:_doPostBack(‘ParamsControl1’,’0’)” 1</a>]
    [<a href=”javascript:_doPostBack(‘ParamsControl1’,’1’)” 2</a>]
    当单击页面时,关联的页面传回到服务器,RaisePostBackEvent()接受该页码并更改它关联的GridView所显示的分页
    处理回传选项

    这里主要用到的类是PostBackOptions类,可以到MSDN上查看其属性。

       //使用回传选项
    
        public class HandlePostOpticesControl : WebControl
    
        {
    
            private string _Text;
    
            public string Text
    
            {
    
                get { return _Text; }
    
                set { _Text = value; }
    
            }
    
            private string _PostBackUrl;
    
            public string PostBackUrl
    
            {
    
                get { return _PostBackUrl; }
    
                set { _PostBackUrl = value; }
    
            }
    
            protected override void AddAttributesToRender(HtmlTextWriter writer)
    
            {
    
                PostBackOptions options = new PostBackOptions(this);
    
                options.ActionUrl = _PostBackUrl;
    
                string eRef = Page.ClientScript.GetPostBackEventReference(options);
    
                writer.AddAttribute(HtmlTextWriterAttribute.Onclick, eRef);
    
                writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
    
                writer.AddAttribute(HtmlTextWriterAttribute.Type, "checkbox");
    
                base.AddAttributesToRender(writer);
    
            }
    
            protected override HtmlTextWriterTag TagKey
    
            {
    
                get
    
                {
    
                    return HtmlTextWriterTag.Input;
    
                }
    
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
    
            {
    
                if (!String.IsNullOrEmpty(_Text))
    
                {
    
                    writer.AddAttribute(HtmlTextWriterAttribute.For, this.ClientID);
    
                    writer.RenderBeginTag(HtmlTextWriterTag.Label);
    
                    writer.Write(_Text);
    
                    writer.RenderEndTag();
    
                }
    
            }
    
        }

    这个控件可以用来支持跨页提交,当控件被单击时,表单被提交到PostBackUrl所指定的页面,在AddAttributesToRender()中,创建了PostBackOptions类的实例,其用于修改ActionUrl以支持跨页提交,该实例传递给GetPostBackEventReference(),生成用于引发回发的JS

    演示部分的关键代码

    <handleps:HandlePostOpticesControl ID="PostOpticesControl1" runat="server" Text="高级选项" PostBackUrl="TestStateControl.aspx" />
    
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

    本文参考了《ASP.NET 3.5揭秘 (卷2)》

  • 相关阅读:
    U-Learning服务端
    C# 向txt文件中写入
    二维码生成 Gma.QrCodeNet (目前测试支持.net4.0及以上,但vs版本2010不可以 NuGet中搜索不到程序包)
    数据显示按规格向datatable中增加空白记录
    sql server 查询出整数 (可灵活运用)
    sql server 列字段拼接 —— STUFF
    layui confirm 嵌套使用 (随笔记)
    sql server 随记 -- 月份/日期 查询
    SQL Server 数据库备份语句
    关于ScriptManager.RegisterStartupScript 摘录
  • 原文地址:https://www.cnblogs.com/626498301/p/1790930.html
Copyright © 2020-2023  润新知