ASP.NET-FineUI开发实践-3
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);
}
}
ASP.NET-FineUI开发实践-3的更多相关文章
- FineUI开源版(ASP.Net)开发实践-目录
点我订阅 目前所有博客的截图,方便离线观看,点图片 FineUI初学手册 下载,实例项目搭建 FineUI初学手册-部分JS整理 部分JS整理 ASP.NET-FineUI开发实践-1 实际开发环境是 ...
- FineUI开发实践-目录
点我订阅 目前所有博客的截图,方便离线观看,点图片 FineUI初学手册 下载,实例项目搭建 FineUI初学手册-部分JS整理 部分JS整理 ASP.NET-FineUI开发实践-1 实际开发环境是 ...
- FineUI开发实践
ASP.NET-FineUI开发实践-7 摘要: 下拉显示grid列表.其实很简单,但是试了很多方法,水平有限,主要是都不好使,还是简单的好使了,分享下.先是看了看网上的,是直接写个了extjs控件类 ...
- ASP.NET-FineUI开发实践-9(四)
现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的. 1. ...
- ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除
本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...
- ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询
上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构
咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
随机推荐
- C++封装常用对象和对头文件探索
在C++实际开发中,难免会使用到一些你极为常用的算法(比如笔者经常使用的多线程技术),实现这些算法的类或是全局函数或是命名空间等等经常都要被使用多次,你会有哪些办法来使用呢?笔者有4个办法. 第一个方 ...
- MySQL主从复制详细部署过程
环境介绍: 采用多实例进行主从复制测试,多实例方法请参考网上其它文档,其实多实例和双服务器对于测试环境来说是一样的. 当前采用3306端口进程为Master,3307端口进程为Slave. ...
- 测试最新的log4cplus1.1.2版
#include "stdafx.h" #include <sstream> class AB{ public: void do_test() { ...
- FLEX 网格布局及响应式处理
上一篇文章用Flex实现BorderLayout,这一章我们来实现常用的网格布局和响应式处理. 首先我们定义HTML结构,主Box为grid,每项为grid-cell,下面就是我们HTML代码结构. ...
- 移除IOS下按钮的原生样式
写WAP页面的时候 一定要加上这组样式,以避免在IOS下面按钮被系统原生样式影响 input,textarea {outline-style:none;-webkit-appearance:none ...
- PHP错误报告级别及调整方法
运行PHP脚本时,PHP解析器会尽其所能能报告它遇到的问题.在PHP中错误报告的处理行为,都是通过PHP的配置文件php.ini中有关的配置指令确定的.另外PHP的错误报告有很多种级别,可以根据不同的 ...
- jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- struts.xml详细配置
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quo ...
- 利用WebApi获取手机号码归属地
前述: 在WebApi中,涉及到一个重要的类,HttpWebRequest. 学习link:httpwebrequest详解 示例演示: 代码示例: 1.前端代码: @{ ViewBag.Title ...
- Watchcow
传送门 题目大意: 给你一幅连通的图,要求从起点1开始走,要经过每条边刚好两次,并且最终回到1起点. 思路:将无向图转换成有向图求欧拉回路. #include<cstdio> #defin ...