私は CSLA.NET を使用して Web プロジェクトに取り組んでいますが、CSLA モデルは Web 開発における中国の国情にはあまり適していないことがわかりました。
彼の一連のテンプレートはすべて、単一のヘッダーと詳細行を持つ「発注書」などのマスター/詳細フォームの考慮に基づいており、WinForm では優れています。
しかし、Web ではほとんどのオブジェクトが別のフォームを使用して編集されるため、少し不便に感じます。
私の理解はまだ深くなく、フレームワーク全体が私に多くの恩恵をもたらしました。本題に入りましょう。
CSLA モデルで Sql2005 ページングを便利に使用するには、4 つの手順を実行する必要があります。
ステップ 1: ページングパラメータを渡すために PagingCriteria を実装します。
[シリアライズ可能()]
パブリック クラス PagingCriteria<T> : CriteriaBase
{
#region がファイルされました
パブリック IDictionary ParamDic { プライベート セット }
パブリック文字列ソート式 { 取得; }
パブリック文字列DefaultOrder {get;
public int StartRowIndex { プライベートセット }
public int MaximumRows { プライベートセット }
#エンドリージョン
protectedPagingCriteria(){ }
public PagingCriteria(IDictionary paramDic, int startRowIndex, int minimumRows, string sortExpression, string defaultOrder)
: ベース(typeof(T))
{
ParamDic = paramDic;
並べ替え式 = 並べ替え式;
デフォルトオーダー = デフォルトオーダー;
StartRowIndex = startRowIndex;
最大行数 = 最大行数;
}
}
ステップ 2: PagingWrapper を実装して、通常の SQL ステートメントをページング ステートメントにカプセル化します。
パブリック静的クラス 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}および {3};({0}) 温度からカウント (*) を選択します。
public static string Wrap(string sqlQuery、string SortExpression、int startRowIndex、int minimumRows)
{
if (string.IsNullOrEmpty(SortExpression))
throw new Exception("並べ替え列が指定されていません。");
return string.Format(SQLTEMPLATE, sqlQuery, SortExpression, startRowIndex +1, startRowIndex + minimumRows);
}
public static string Wrap<T>(string sqlQuery、PagingCriteria<T> 条件)
{
文字列順序 = (string.IsNullOrEmpty(criteria.SortExpression)) ? criteria.DefaultOrder : criteria.SortExpression;
return Wrap(sqlQuery, order, criteria.StartRowIndex, criteria.MinimumRows);
}
}
パート 3: コレクション オブジェクトで呼び出されるのは、RoleList です。
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
文字列 sql = "SELECT * FROM ロール";
cm.CommandText = PagingWrapper.Wrap(sql, criteria);
(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 インターフェイスの実装です。
ステップ 4: ページでデータ ソース コントロールを使用し、Gridview をバインドし、ページングを実装します。
プライベート int totalCount = 0;
protected void CslaDs_SelectObject(オブジェクト送信者、Csla.Web.SelectObjectArgs e)
{
BLL.Security.RoleList リスト = BLL.Security.RoleList.PagingRoleList(null, e.SortExpression, e.StartRowIndex, e.MinimumRows);
e.BusinessObject = リスト;
totalCount = リスト.TotalRowCount;
}
protected void gvlist_RowDataBound(オブジェクト送信者、GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
((ラベル)e.Row.FindControl("lblTotal")).Text = totalCount.ToString();
}
} public static RoleList PagingRoleList(IDictionary paramDic, string SortExpression, int startRowIndex, int minimumRows)
{
return DataPortal.Fetch<RoleList>(new PagingCriteria<RoleList>(paramDic, startRowIndex, minimumRows, SortExpression, "ID"));
}ページグリッドビューのページネーション部分:
<ポケベルテンプレート>
<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="Home" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
CommandName="Page" CommandArgument="First"></asp:LinkButton>
<asp:LinkButton ID="lbnPrev" runat="server" Text="前のページ" 有効='<%# ((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 />
ここで説明する必要があるのは、合計行数は list.TotalRowCount プロパティを通じて取得されるため、RoleList は Csla.Core.IReportTotalRowCount インターフェイスを実装する必要があるということです。
なぜ総行数を Gridview と PagerTemplate に直接書き込めないのかと疑問に思われるかもしれませんが、実際、これは Gridview がこのプロパティである System.Web.UI.DataSourceSelectArguments オブジェクトを公開していないためです。
データを取得した後、総行数は Gridview の内部に返されますが、Gridview はプライベート メソッドでローカルの PagedDataSourse を構築し、その中に総行数を記録します。外部から取得したり、外部から取得したりすることはできません。反射。
したがって、最も簡単な方法は、最初にそれを書き留めてから、RowDataBound イベントに書き込むことです。完璧を求める場合は、Gridview を自分でカプセル化し、TotalRowCount プロパティを追加して公開します。