国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

CSLA.Net在Web項目中使用SQL2005的分頁

2019-11-17 03:50:31
字體:
來源:轉載
供稿:網友
正用CSLA.NET做一個Web的項目, 發現CSLA的模型在開發Web時, 不是很適合中國國情.

他的一系列模版, 都是基于主從表單的考慮, 比如"采購單", 這樣有單頭, 有明細行的情況, 這在WinForm下很棒.

但Web下, 大部分對象都單獨用一個表單進行編輯, 所以感覺有些別扭.

我的理解還不深入, 還不斷學習中, 整個框架讓我受益很多. 廢話完了, 進入正題.

要在CSLA模型中方便的使用Sql2005的分頁, 我們要做四步.

第一步: 實現一個PagingCriteria, 用來傳遞分頁參數.

    [Serializable()]
    public class PagingCriteria<T> : CriteriaBase
    {
        #region Filed
        public IDictionary ParamDic { get; PRivate set; }
        public string SortExpression { get; private set; }
        public string DefaultOrder { get; private set; }
        public int StartRowIndex { get; private set; }
        public int MaximumRows { get; private set; }
        #endregion

        protected PagingCriteria(){ }

        public PagingCriteria(IDictionary paramDic, int startRowIndex, int maximumRows, string sortExpression, string defaultOrder)
            : base(typeof(T))
        {
            ParamDic = paramDic;
            SortExpression = sortExpression;
            DefaultOrder = defaultOrder;
            StartRowIndex = startRowIndex;
            MaximumRows = maximumRows;
        }
    }

第二步: 實現PagingWrapper, 將普通的Sql語句封裝成可分頁的語句.

    public static class PagingWrapper
    {
        private const string SQLTEMPLATE = @"With TargetTable AS(select ROW_NUMBER() OVER (order by Temp.{1})as RowNumber,Temp.* from ({0}) as Temp) select * from TargetTable WHERE RowNumber between {2} and {3};Select count(*) from ({0}) Temp";
        public static string Wrap(string sqlQuery, string SortExpression, int startRowIndex, int maximumRows)
        {
            if (string.IsNullOrEmpty(SortExpression))
                throw new Exception("未指定排序列.");

            return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + maximumRows);
        }

        public static string Wrap<T>(string sqlQuery, PagingCriteria<T> criteria)
        {
            string order = (string.IsNullOrEmpty(criteria.SortExpression)) ? criteria.DefaultOrder : criteria.SortExpression;
            return Wrap(sqlQuery, order, criteria.StartRowIndex, criteria.MaximumRows);
        }
    }

第三部: 在集合對象中調用.這里是RoleList.

using (SqlCommand cm = cn.CreateCommand())
{
    cm.CommandType = CommandType.Text;
    string sql = "SELECT * FROM Roles";
    cm.CommandText = PagingWrapper.Wrap(sql, criteria);
    using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
    {
        while (dr.Read())
        Add(Role.FillRole(dr));
        dr.NextResult();
        dr.Read();
        TotalRowCount = dr.GetInt32(0);
     }
}CommandText就是調用用Wrapper返回的. TotalRowCount屬性是Csla.Core.IReportTotalRowCount接口的實現.

第四步: 在頁面上用數據源控件, 綁定Gridview并實現分頁:

private int totalCount = 0;
protected void CslaDs_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
{
     BLL.Security.RoleList list = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MaximumRows);
     e.BusinessObject = list;
     totalCount = list.TotalRowCount;
}

protected void gvlist_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.Pager)
     {
        ((Label)e.Row.FindControl("lblTotal")).Text = totalCount.ToString();
     }
}public static RoleList PagingRoleList(IDictionary paramDic, string SortExpression, int startRowIndex, int maximumRows)
        {
            return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex, maximumRows, SortExpression, "ID"));
        }頁面Gridview分頁部分:

<PagerTemplate>
   <br />
   共<asp:Label ID="lblTotal" runat="server" ></asp:Label>行
   <asp:Label ID="lblPage" runat="server" Text='<%# "第" + (((GridView)Container.NamingContainer).PageIndex + 1)  + "頁/共" + (((GridView)Container.NamingContainer).PageCount) + "頁" %> '></asp:Label>
   <asp:LinkButton ID="lbnFirst" runat="Server" Text="首頁" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
      CommandName="Page" CommandArgument="First"></asp:LinkButton>
   <asp:LinkButton ID="lbnPrev" runat="server" Text="上一頁" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
       CommandName="Page" CommandArgument="Prev"></asp:LinkButton>
   <asp:LinkButton ID="lbnNext" runat="Server" Text="下一頁" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
       CommandName="Page" CommandArgument="Next"></asp:LinkButton>
   <asp:LinkButton ID="lbnLast" runat="Server" Text="尾頁" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
       CommandName="Page" CommandArgument="Last"></asp:LinkButton>
    <br />
</PagerTemplate>這里要說明的是, 總行數是通過list.TotalRowCount屬性來獲得的. 所以RoleList 需要實現Csla.Core.IReportTotalRowCount接口.

你可能會問, 為什么不在Gridview,PagerTemplate中直接寫入總行數, 其實是因為Gridview并未暴露這個屬性,System.Web.UI.DataSourceSelectArguments對象,

在獲取數據后, 會將總行數返回給Gridview內部, 但Gridview內部會在私有方法中,構一個局部的PagedDataSourse, 將總行數記錄在里面, 外部無法獲取, 通過反射也不行.

所以最簡單的方式, 就是先記下來, 然后在RowDataBound事件中把它寫上去. 如果你要求完美, 可以自己封裝一個Gridview加上這個TotalRowCount屬性,并暴露出來.



如果有更好的辦法, 請告訴我, 不要保留:)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莲花县| 廊坊市| 和林格尔县| 宁城县| 会东县| 临猗县| 安图县| 莱西市| 盐亭县| 五指山市| 阿拉尔市| 尚志市| 富川| 达日县| 建水县| 吉水县| 永和县| 娱乐| 桐城市| 太和县| 和龙市| 庆城县| 司法| 兴海县| 怀宁县| 三亚市| 新宁县| 互助| 房产| 林芝县| 乐都县| 左贡县| 离岛区| 鸡西市| 陇川县| 临颍县| 黔南| 延吉市| 临泉县| 喀喇沁旗| 德江县|