天天看點

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);
            }
        }