asp.net Repeater排序用的控件应用与详解

asp教程.net repeater排序用的控件应用与详解

.aspx页代码

如果使用网站形式,那么将.cs文件放在app_code下,如果是webapplication则随便扔在那个目录下都可以

/----------------导入控件(网站方式--动态编译)--------------------/

<%@ register  namespace="f.studio.webcontrols" tagprefix="fs" %>

:也可以在web.config中做个全局配置,这样就不用每个页面引用一次了

/----------------repeater 控件部分--------------------------/

    <table style="width:100%;">
        <tr>
            <td>
                <asp:linkbutton id="lnkorderbyclientid"  runat="server">id</asp:linkbutton>
                </td>
            <td>
               <asp:linkbutton id="lnkorderbygettime"  runat="server" >获得时间</asp:linkbutton>   </td>
            <td>
                <asp:linkbutton id="lnklastconttime"  runat="server">最后联系时间</asp:linkbutton>  </td>
        </tr>
        <asp:repeater id="repeater1" runat="server">
        <itemtemplate>
        <tr>
            <td>
                <%#eval("id") %></td>
            <td>
                <%#eval("lastgettime") %></td>
            <td>
               <%#eval("lastcontcttime") %> </td>
        </tr>
        </itemtemplate>
        </asp:repeater>
    </table>

/----------------------控件配置部分--------------------------/

    <fs:orderbystatemanager id="orderby" runat="server" defaultorderbysql="client.[clientid]" onchanged="binddataafterorderby">
    <fs:sortcolumn field="client.[lastcontacttime]" linkbuttonid="lnklastconttime" />
    <fs:sortcolumn field="client.[currusergettime]" linkbuttonid="lnkorderbygettime" />
    <fs:sortcolumn field="client.[clientid]" linkbuttonid="lnkorderbyclientid" />
    </fs:orderbystatemanager>

控件属性与方法:

1.field-排序字段(可能为空)

2.isasc-排序方向

3.tostring()方法返回排序tsql语句(如:client.[clientid] asc),当field为空时,返回defaultorderbysql指定的语句

排序状态改变时会触发,onchange事件指定的处理函数,通常的处理是进行一次数据绑定, 参考下面代码:

        /// <summary>
        /// 排序后重新绑订数据
        /// </summary>
        protected void binddataafterorderby(orderbystatemanager orderby)
        {
            try
            {
                binddata();
            }
            catch (exception ex)
            {
                jscript.alert(ex.message);
            }
       }

 

orderbystatemanger.cs文件

using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.runtime.serialization;
using system.web.ui.webcontrols;
using system.web.ui;
using system.componentmodel;
using system.collections;
using system.drawing.design;
using system.security.permissions;

namespace f.studio.webcontrols
{

    /// <summary>
    /// 单列排序结构类
    /// </summary>
    ///
    [serializable]
    [
        aspnethostingpermission(securityaction.demand,
            level = aspnethostingpermissionlevel.minimal),
        aspnethostingpermission(securityaction.inheritancedemand,
            level = aspnethostingpermissionlevel.minimal),
        defaultproperty("sortcolumns"),
        parsechildren(true, "sortcolumns"),
        toolboxdata("<{0}:orderbystatemanager runat="server"> </{0}:orderbystatemanager>")

     ]
    public class orderbystatemanager : control
    {

        public event orderbystatechanged changed;

        public orderbystatemanager(string field, bool isasc)
        {
            field = field;
            isasc = isasc;
        }
        public orderbystatemanager()
        {

        }
        #region  集合属性
        private list<sortcolumn> _sortcolumns;
        [
         category("behavior"),
         description("排序字段与对应控件映射集合"),
         designerserializationvisibility(
             designerserializationvisibility.content),
         editor(typeof(ilist<sortcolumn>), typeof(uitypeeditor)),
         persistencemode(persistencemode.innerdefaultproperty)
        ]
        public list<sortcolumn> sortcolumns
        {
            get
            {
                if (_sortcolumns == null)
                {
                    _sortcolumns = new list<sortcolumn>();
                }
                return _sortcolumns;
            }
        }
        #endregion
        protected override void onload(eventargs e)
        {
            base.onload(e);

            sortcolumns.foreach(column =>
            {
                var ctr = page.findcontrol(column.linkbuttonid) as linkbutton;
                if (ctr != null)
                {
                    addmap(column.field, ctr);
                }
            });

        }

        /// <summary>
        /// sender 需要是 linkbutton类型
        /// </summary>
        /// <param name="sender"></param>
        public void setorderby(object sender)
        {

            var item = fieldtolnkmap.firstordefault(ent => ent.value.equals(sender));

            if (item.value == null) throw new exception("集合中没有指定触发排序事件linkbutton项目!");

            //顺序:上、下、取消
            if (string.isnullorempty(field))
            {
                isasc = true;
                field = item.key;
            }
            else
            {
                if (string.compare(field, item.key, true) == 0)//点同一个
                {
                    if (isasc) isasc = false;
                    else field = string.empty;

                }
                else
                {
                    field = item.key;
                    isasc = true;
                }
            }

            //只支持单个字段排序,清除全部控件的标志
            foreach (var kv in fieldtolnkmap)
            {
                kv.value.text = kv.value.text.trimend("↑,↓".tochararray());
            }

            if (!string.isnullorempty(field))
            {
                //触发控件加标志
                item.value.text += (isasc ? "↑" : "↓");

            }

            if (changed != null)
            {
                changed(this);
            }

        }

        #region 映射集合
        public void addmap(string field, linkbutton lnk)
        {
            lnk.click += orderbylnkclick;

            fieldtolnkmap.add(field, lnk);
        }

        private void orderbylnkclick(object sender, eventargs e)
        {
            setorderby(sender);
        }

        private dictionary<string, linkbutton> _fieldtolnkmap;
        protected dictionary<string, linkbutton> fieldtolnkmap
        {
            get
            {
                if (_fieldtolnkmap == null)
                {
                    _fieldtolnkmap = new dictionary<string, linkbutton>();
                }
                return _fieldtolnkmap;
            }
        }
        #endregion

        #region 序列化字段
        const string c_field = @"obsm_field";
        public string field {
            get
            {
                  return viewstate[c_field] as string;
             }
            set
            {
                viewstate[c_field] = value;
            }
        }
        const string c_isasc = @"obsm_isasc";
        public bool isasc
        {
            get
            {
                if (viewstate[c_isasc] == null)
                {

                    viewstate[c_isasc] = true;
                }

                return (bool)viewstate[c_isasc];
            }
            set
            {
                viewstate[c_isasc] = value;
            }

        }

        [
         category("behavior"),
         defaultvalue(""),
         description("默认排序"),
        ]
        private string _defaultorderbysql = string.empty;
         public string defaultorderbysql {
             get
             {
                 return _defaultorderbysql;
             }
             set
             {
                 _defaultorderbysql = value;
             }
         }
        public override string tostring()
        {
            if (string.isnullorempty(field)) return defaultorderbysql;

            return string.format(" {0} {1} ", field, isasc ? "asc" : "desc");
        }

 

        #endregion

 
    }
    public delegate void orderbystatechanged(orderbystatemanager orderby);

    [serializable]
    [typeconverter(typeof(expandableobjectconverter))]
    public class sortcolumn
    {
        public sortcolumn()
        {

        }

        [
            category("behavior"),
            defaultvalue(""),
            description("排序字段"),
            notifyparentproperty(true),
        ]
        public string field { get; set; }

        [
         category("behavior"),
         defaultvalue(""),
         description("linkbutton控件id"),
         notifyparentproperty(true),
        ]
        public string linkbuttonid { get; set; }
    }
}

时间: 2025-01-28 01:17:49

asp.net Repeater排序用的控件应用与详解的相关文章

C++中MFC Tab Control控件的使用详解

  这篇文章主要介绍了C++中MFC Tab Control控件的使用详解的相关资料,需要的朋友可以参考下 1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添

Android中Spinner(下拉框)控件的使用详解_Android

android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

Android中Spinner(下拉框)控件的使用详解

android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

ASP.NET中BulletedList列表控件使用及详解_基础应用

BulletedList 控件创建一个无序或有序(编号)的项列表,它们分别呈现为 HTML UL 或 OL 标记.可以指定项.项目符号或编号的外观,可以静态定义列表项或通过将控件绑定到数据来定义列表项,也可以在用户单击项时作出响应. 对于ASP.NET 1.x里要动态显示Bulledted List时,要么自己利用HTML的<ol>或<ul>元素构造,要么就是"杀鸡用牛刀"的动用Repeater来显示.前者过于死板,后者过于Overkill,也许微软听到这种声音

ASP.NET 中 Button、LinkButton和ImageButton 三种控件的使用详解_基础应用

ASP.NET Framework包含三个用于向服务器端提交表单的控件:Button.LinkButton和ImageButton.这三个控件拥有同样的功能,但每种控件的外观界面不同. 本文就带着大家学习如何在页面中使用这三种控件.然后,学习如何关联客户端脚本和服务器端Button控件,以及如何使用Button控件把一个表单传到不是当前页的页面.最后,学习如何处理Button控件的Command事件. 一.使用Button控件 Button控件用来向服务器端提交表单的按钮.例如,代码清单1中的页

ASP.NET技巧:GridView控件自定义分页详解

asp.net|分页|技巧|控件|详解   前些天我写了关于 <<在存储过程中实现分页>>和<<GridView控件事件详解 >> ,后来又有一些人问我怎样在GridView中应用这个东东!其实很简单,主要是怎么保存当前页面的页码PageIndex问题,不过把这个解决了什么都好办了.因为在分页过程中:PageSize是一定的,我们可以用一个属性来表示.保存PageIndex好多中方法,而且数据不是很庞大,基本不会好太多的资源.还是一句老话,话再多都没有例子直

ASP.NET控件之RadioButtonList详解_实用技巧

"RadioButtonList"控件表示一个封装了一组单选按钮控件的列表控件.  可以使用两种类型的 ASP.NET 控件将单选按钮添加到网页上:各个"RadioButton"控件或一个"RadioButtonList"控件.这两类控件都允许用户从一小组互相排斥的预定义选项中进行选择.使用这些控件,可定义任意数目的带标签的单选按钮,并将它们水平或垂直排列.  命名空间:System.Web.UI.WebControls程序集:System.We

JavaScript日历控件插件使用详解(支持中文英文繁体)

kimsoft-jscalendar一款优秀的#JavaScript#日历控件,kimsoft-jscalendar.它小巧,单文件:支持多语言:兼容ie6.0+, firefox1.0+, Opera9,其它浏览器未测试:回显选定的时间:Apache license 2.0,商业友好.用 iframe 解决 IE 中层在 select 控件上显示的问题 一.什么是 kimsoft-jscalendar 一个简洁的avaScript日历控件,可在Java Web项目,.NET Web 项目中使用

DevExpress控件汉化详解(WebForm)

所有Developer Express .NET产品都有本地化资源,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等等,所有这些资源字符串可以很容易地被翻译成各种语言. 先看下面汉化前后的图片: 汉化前 汉化后 如何实现上述的汉化呢?Dev汉化总结下来一般分三种形式:一种是利用已经汉化好的资源包:一种是使用本地对象类,利用代码汉化:还有就是资源包和代码结合.下面我们就这三种情况的实现方法和各自的利弊做一详细的讲解. 一.利用资源包汉化 一.如何使用资源包进行汉化 首先,您需下载现有的资源包