ASP.NET-FineUI开发实践-3

简介: 1.参照模拟数据库分页通过缓存重写内存分页,优化页面响应速度 Grid的响应速度是硬伤,我写了个通用方法把所有数据放在缓存中模拟数据库分页,比自带的缓存分页快很多,这里贴上实体类的通用方法,DataTable的就不贴了可以参照官方的自己写。

1.参照模拟数据库分页通过缓存重写内存分页,优化页面响应速度

Grid的响应速度是硬伤,我写了个通用方法把所有数据放在缓存中模拟数据库分页,比自带的缓存分页快很多,这里贴上实体类的通用方法,DataTable的就不贴了可以参照官方的自己写。记住要加上grid_PageIndexChange事件和grid_Sort事件,这里就不写了

  

        /// <summary>
        /// 获取数据源
        /// </summary>
        /// <returns></returns>
        private void GetData()
        {
            List<MsUser> lstUser = GetData();//数据库返回数据实体
            ViewState["lstUserData"] = JsonConvert.SerializeObject(lstUser);
        }

        /// <summary>
        /// 数据源绑定
        /// </summary>
        private void BindGridView()
        {
            string slstUserData = ViewState["lstUserData"].ToString();
            BindGridView<MsUser>(slstUserData, ref grid);
        }



         /// <summary>
        /// 绑定数据源
        /// </summary>
        /// <typeparam name="T">范数据</typeparam>
        /// <param name="vDataNew">数据Json</param>
        /// <param name="g">grid</param>
        public static void BindGridView<T>(string vDataNew, ref Grid g)
        {

            List<T> DataNew = (List<T>)JsonConvert.DeserializeObject(vDataNew, typeof(List<T>));
            g.RecordCount = DataNew.Count;
            int pageSize = g.PageSize;//获取页显示数
            int pageIndex = g.PageIndex;//获取当前页数
            int pi = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(DataNew.Count) / Convert.ToDouble(g.PageSize)));
            pageIndex = pageIndex + 1 > pi ? pi - 1 : pageIndex;//重新绑定时(如查询)要判断页数
            if (pageIndex < 0)
            {
                pageIndex = 0;
            }
            try
            {
                Reverser<T> reverser = null;
                string SortField = g.SortField;//获取排序字段
                if (SortField == "")
                {
                    SortField = g.Columns[1].SortField;//默认第二列为排序列
                }
                reverser = new Reverser<T>(DataNew[0].GetType(), SortField, g.SortDirection == "ASC" ? ReverserInfo.Direction.ASC : ReverserInfo.Direction.DESC);//排序方法
                DataNew.Sort(reverser);
                if (pageSize <= DataNew.Count)
                {
                    int pz = pageSize < DataNew.Count - pageIndex * pageSize ? pageSize : DataNew.Count - pageIndex * pageSize;
                    if (pageSize == DataNew.Count)
                    {
                        pz = pageSize;
                    }
                    DataNew = DataNew.GetRange((pageIndex) * pageSize, pz);//截取数据
                }

                g.DataSource = DataNew;//绑定
                g.DataBind();

            }
            catch (Exception ex)
            {
                //Response.Write(ex.Message);
                g.DataSource = null;
                g.DataBind();
            }
            g.PageIndex = g.PageIndex + 1 > g.PageCount ? g.PageCount - 1 : g.PageIndex;
            if (g.PageIndex < 0)
            {
                g.PageIndex = 0;
            }
        }



     /*从网上下的实体类排序类*/
    /// <summary>
    /// 继承IComparer<T>接口,实现同一自定义类型 对象比较
    /// </summary>
    /// <typeparam name="T">T为泛用类型</typeparam>
    public class Reverser<T> : IComparer<T>
    {
        private Type type = null;
        private ReverserInfo info;

        /**/
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="type">进行比较的类类型</param>
        /// <param name="name">进行比较对象的属性名称</param>
        /// <param name="direction">比较方向(升序/降序)</param>
        public Reverser(Type type, string name, ReverserInfo.Direction direction)
        {
            this.type = type;
            this.info.name = name;
            if (direction != ReverserInfo.Direction.ASC)
                this.info.direction = direction;
        }


        /**/
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="className">进行比较的类名称</param>
        /// <param name="name">进行比较对象的属性名称</param>
        /// <param name="direction">比较方向(升序/降序)</param>
        public Reverser(string className, string name, ReverserInfo.Direction direction)
        {
            try
            {
                this.type = Type.GetType(className, true);
                this.info.name = name;
                this.info.direction = direction;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /**/
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="t">进行比较的类型的实例</param>
        /// <param name="name">进行比较对象的属性名称</param>
        /// <param name="direction">比较方向(升序/降序)</param>
        public Reverser(T t, string name, ReverserInfo.Direction direction)
        {
            this.type = t.GetType();
            this.info.name = name;
            this.info.direction = direction;
        }

        //必须!实现IComparer<T>的比较方法。
        int IComparer<T>.Compare(T t1, T t2)
        {
            object x = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t1, null);
            object y = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t2, null);
            if (this.info.direction != ReverserInfo.Direction.ASC)
                Swap(ref x, ref y);
            return (new CaseInsensitiveComparer()).Compare(x, y);
        }

        //交换操作数
        private void Swap(ref object x, ref object y)
        {
            object temp = null;
            temp = x;
            x = y;
            y = temp;
        }
    }

    /**/
    /// <summary>
    /// 对象比较时使用的信息类
    /// </summary>
    public struct ReverserInfo
    {
        /**/
        /// <summary>
        /// 比较的方向,如下:
        /// ASC:升序
        /// DESC:降序
        /// </summary>
        public enum Direction
        {
            ASC = 0,
            DESC,
        };

        public enum Target
        {
            CUSTOMER = 0,
            FORM,
            FIELD,
            SERVER,
        };

        public string name;
        public Direction direction;
        public Target target;
    }

  

2.得到指定行指定列的值后台,rows的values是行的值,后台可以看到,通过列号找到数组的值,这个方法不是很保险但是聊胜于无

01.grid.Rows[rowindex].Values[grid.FindColumn(Columnid).ColumnIndex].ToString();  

  

3.按钮至少选择一项的通用方法,OnClientClick+=累加。

        /// <summary>
        /// 至少选择一项
        /// </summary>
        /// <param name="g"></param>
        /// <param name="ctrls"></param>
        private void NoSelectionNull(Grid g, params FineUI.Button[] ctrls)
        {
            foreach (FineUI.Button ctrl in ctrls)
            {
                ctrl.OnClientClick += g.GetNoSelectionAlertReference("至少选择一项!");
            }
        }
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
              NoSelectionNull(Grid1, Button4, Button2, Button3, Button6);
            }
        }

  

目录
相关文章
|
15天前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
120 3
|
15天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
15天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
2月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
36 1
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器
|
JavaScript API
ASP.NET-FineUI开发实践-9(四)
现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的。 1.
909 0
|
前端开发 API 数据库
ASP.NET-FineUI开发实践-9(三)
1. TextChanged事件前台触发回发后台,接上文,先给TextBox1加上事件,看看是怎么生成出来的, 注意AutoPostBack="true",找源代码,f4多出了个 listeners: { change: function () { ...
845 0
|
前端开发 JavaScript
ASP.NET-FineUI开发实践-8(二)
把上回的做一些改进 1.点击grid2的行改变TriggerBox1的值 var v = $(item).find('.x-grid-cell-Name div.
808 0