English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
以前はBを専門にしていました/S開発では、会社に大きなCがあります/Sプロジェクトでは、DATAGRIDVIEWを使用する際にデータ量が大きいため、ページングモードを使用していますが、これが正しいかどうか分かりません。
Cを見つけたい/Sのページングコントロールはあまり良いものがなく、自分でBと連携しました。/Sのページングコントロールを、WINFORMの下に変更します。
まずユーザーコントロールを作成し、pagerという名前をつけます。そのコントロールにbindingNavigatorとbindingSourceをドラッグ&ドロップし、bindingNavigatorを変更し、必要なコントロールを追加します。
効果は以下の通りです:
コードの実装は以下の通りです:
ネームスペース WindowsApp.MyControl { /**//// <summary> /// デリゲートの宣言 /// </summary> /// <引数 name="e"></引数> /// <戻り値></戻り値> public delegate int EventPagingHandler(EventPagingArg e); /**//// <summary> /// ページングコントロールの表示 /// </summary> public partial class Pager : UserControl { public Pager() { InitializeComponent(); } public event EventPagingHandler EventPaging; /**//// <summary> /// ページごとの表示レコード数 /// </summary> private int _pageSize = 20; /**//// <summary> /// ページごとの表示レコード数 /// </summary> public int PageSize { get { return _pageSize; } set { _pageSize = value; GetPageCount(); } } private int _nMax = 0; /**//// <summary> /// 全記録数 /// </summary> public int NMax { get { return _nMax; } set { _nMax = value; GetPageCount(); } } private int _pageCount = 0; /**//// <summary> /// ページ数=総記録数/ページごとの表示レコード数 /// </summary> public int PageCount { get { return _pageCount; } set { _pageCount = value; } } private int _pageCurrent = 0; /**//// <summary> /// 現在のページ番号 /// </summary> public int PageCurrent { get { return _pageCurrent; } set { _pageCurrent = value; } } private void GetPageCount() { if (this.NMax > 0) { this.PageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(this.NMax)) / Convert.ToDouble(this.PageSize))); } else { this.PageCount = 0; } } /**//// <summary> /// ページ制御コントロールデータバインディングのメソッド /// </summary> public void Bind() { if (this.EventPaging != null) { this.NMax = this.EventPaging(new EventPagingArg(this.PageCurrent)); } if (this.PageCurrent > this.PageCount) { this.PageCurrent = this.PageCount; } if (this.PageCount == 1) { this.PageCurrent = 1; } lblPageCount.Text = this.PageCount.ToString(); this.lblMaxPage.Text = "全"+this.NMax.ToString()+「件記録」; this.txtCurrentPage.Text = this.PageCurrent.ToString(); if (this.PageCurrent == 1) { this.btnPrev.Enabled = false; this.btnFirst.Enabled = false; } else { btnPrev.Enabled = true; btnFirst.Enabled = true; } if (this.PageCurrent == this.PageCount) { this.btnLast.Enabled = false; this.btnNext.Enabled = false; } else { btnLast.Enabled = true; btnNext.Enabled = true; } if (this.NMax == 0) { btnNext.Enabled = false; btnLast.Enabled = false; btnFirst.Enabled = false; btnPrev.Enabled = false; } } private void btnFirst_Click(object sender, EventArgs e) { PageCurrent = 1; this.Bind(); } private void btnPrev_Click(object sender, EventArgs e) { PageCurrent -= 1; if (PageCurrent <= 0) { PageCurrent = 1; } this.Bind(); } private void btnNext_Click(object sender, EventArgs e) { this.PageCurrent += 1; if (PageCurrent > PageCount) { PageCurrent = PageCount; } this.Bind(); } private void btnLast_Click(object sender, EventArgs e) { PageCurrent = PageCount; this.Bind(); } private void btnGo_Click(object sender, EventArgs e) { if (this.txtCurrentPage.Text != null && txtCurrentPage.Text != "") { if (Int32.TryParse(txtCurrentPage.Text, out _pageCurrent)) { this.Bind(); } else { Common.MessageProcess.ShowError("数字の形式が間違っています!"); } } } } /**//// <summary> /// カスタムイベントデータのベースクラス /// </summary> public class EventPagingArg : EventArgs { private int _intPageIndex; public EventPagingArg(int PageIndex) { _intPageIndex = PageIndex; } } }
コントロール機能は基本的に実装されています。
データをバインドする方法はどうすればいいですか?
大量の分ページは、ストレージプロシージャを使用します。
このストレージプロシージャはネット上から取得したものです、呵呵。これをここに貼り付けて、元の著作者が私に石を投げないことを願っています。
ALTER PROCEDURE SP_Pagination /**//* *************************************************************** ** 千万数量級の分ページストレージプロシージャ ** *************************************************************** パラメータ説明: 1.Tables : テーブル名、ビュー 2.PrimaryKey : 主キー 3.Sort : ソート文、OrderByなし。例:NewsID Desc,OrderRows Asc 4.CurrentPage : 現在のページ番号 5.PageSize : ページサイズ 6.Filter : フィルタ文、Whereなし 7.Group : Group文、Group Byなし 効果デモ:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx ***************************************************************/ ( @Tables varchar(2000), @PrimaryKey varchar(500), @Sort varchar(500) = NULL, @CurrentPage int = 1, @PageSize int = 10, @Fields varchar(2000) = '"*', @Filter varchar(1000) = NULL, @Group varchar(1000) = NULL ) AS /**//*デフォルトソート*/ IF @Sort IS NULL OR @Sort = '' SET @Sort = @PrimaryKey DECLARE @SortTable varchar(1000) DECLARE @SortName varchar(1000) DECLARE @strSortColumn varchar(1000) DECLARE @operator char(2) DECLARE @type varchar(1000) DECLARE @prec int /**//*設定排序文.*/ IF CHARINDEX('DESC',@Sort)>0 BEGIN SET @strSortColumn = REPLACE(@Sort, 'DESC', '') SET @operator = '<=' END ELSE BEGIN IF CHARINDEX('ASC', @Sort) = 0 SET @strSortColumn = REPLACE(@Sort, 'ASC', '') SET @operator = '>=' END IF CHARINDEX('.', @strSortColumn) > 0 BEGIN SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn)) SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn)) END ELSE BEGIN SET @SortTable = @Tables SET @SortName = @strSortColumn END SELECT @type=t.name, @prec=c.prec FROM sysobjects o syscolumns cとJOINします systypes tとJOINします WHERE o.name = @SortTable AND c.name = @SortName IF 'char'がタイプ内に存在する場合 タイプを設定します + '(' + @precをキャストします + ') ページサイズを宣言します500) 現在のページの開始行を宣言します500) フィルタリングの文字列を宣言します1000) シンプルフィルタリングの文字列を宣言します1000) グループ化の文字列を宣言します1000) /**//*デフォルトの現在ページ*/ IF @CurrentPage < 1 現在のページを設定します 1 /**//*ページングパラメータを設定します*/ ページサイズをキャストして文字列にします500)) 現在のページの開始行をキャストします - 1)*@PageSize + 1) AS varchar(500)) /**//*フィルタリングおよびグループ化の文*/ IF @Filter IS NOT NULL AND @Filter != '' BEGIN フィルタリングの文字列を設定します' + @Filter + ' ' シンプルフィルタリングの文字列を設定します' + @Filter + ' ' END ELSE BEGIN シンプルフィルタリングの文字列を初期化します フィルタリングの文字列を初期化します END IF @Group IS NOT NULL AND @Group != '' グループ化の文字列を設定します' + @Group + ' ' ELSE グループ化の文字列を初期化します /**//*クエリを実行します*/ 実行します( ' ソートカラムを宣言します' + @type + ' 行数を設定します' + @strStartRow + ' ソートカラムを設定します' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' 行数を設定します' + @strPageSize + ' SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' ' )
このストレージを利用してデータを取得し、データコントロールにバインドすることで、PageDataクラスを提供します
/**//// <summary> /// データソース提供 /// </summary> public class PageData { private int _PageSize = 10; private int _PageIndex = 1; private int _PageCount = 0; private int _TotalCount = 0; private string _TableName;//テーブル名 private string _QueryFieldName = "*";//テーブルフィールドFieldStr private string _OrderStr = string.Empty; //並び替え_SortStr private string _QueryCondition = string.Empty;//クエリの条件 RowFilter private string _PrimaryKey = string.Empty;//主键 /**//// <summary> /// 表示ページ数 /// </summary> public int PageSize { get { return _PageSize; } set { _PageSize = value; } } /**//// <summary> /// 現在のページ /// </summary> public int PageIndex { get { return _PageIndex; } set { _PageIndex = value; } } /**//// <summary> /// 全ページ数 /// </summary> public int PageCount { get { return _PageCount; } } /**//// <summary> /// 全記録数 /// </summary> public int TotalCount { get { return _TotalCount; } } /**//// <summary> /// テーブル名、ビューを含む /// </summary> public string TableName { get { return _TableName; } set { _TableName = value; } } /**//// <summary> /// テーブルフィールドFieldStr /// </summary> public string QueryFieldName { get { return _QueryFieldName; } set { _QueryFieldName = value; } } /**//// <summary> /// 並び替えフィールド /// </summary> public string OrderStr { get { return _OrderStr; } set { _OrderStr = value; } } /**//// <summary> /// 查询条件 /// </summary> public string QueryCondition { get { return _QueryCondition; } set { _QueryCondition = value; } } /**//// <summary> /// 主键 /// </summary> public string PrimaryKey { get { return _PrimaryKey; } set { _PrimaryKey = value; } } public DataSet QueryDataTable() { SqlParameter[] parameters = { new SqlParameter("@Tables", SqlDbType.VarChar , 255), new SqlParameter("@PrimaryKey" , SqlDbType.VarChar , 255), new SqlParameter("@Sort", SqlDbType.VarChar , 255 ), new SqlParameter("@CurrentPage", SqlDbType.Int), new SqlParameter("@PageSize", SqlDbType.Int), new SqlParameter("@Fields", SqlDbType.VarChar , 255), new SqlParameter("@Filter", SqlDbType.VarChar ,1000), new SqlParameter("@Group", SqlDbType.VarChar , 1000 ) }; parameters[0].Value = _TableName; parameters[1].Value = _PrimaryKey; parameters[2].Value = _OrderStr; parameters[3].Value = PageIndex; parameters[4].Value = PageSize; parameters[5].Value = _QueryFieldName; parameters[6].Value = _QueryCondition; parameters[7].Value = string.Empty; DataSet ds = DbHelperSQL.RunProcedure("SP_Pagination", parameters, "dd"); _TotalCount = GetTotalCount(); if (_TotalCount == 0) { _PageIndex = 0; _PageCount = 0; } else { _PageCount = _TotalCount % _PageSize == 0 ? _TotalCount / _PageSize : _TotalCount / _PageSize + 1; if (_PageIndex > _PageCount) { _PageIndex = _PageCount; parameters[4].Value = _PageSize; ds = QueryDataTable(); } } return ds; } public int GetTotalCount() { string strSql = " select count("1) from "+_TableName; if (_QueryCondition != string.Empty) { strSql +=" where " + _QueryCondition; } return int.Parse(DbHelperSQL.GetSingle(strSql).ToString()); } }
ページにDATAGRIDVIEWを置いて、pagerコンテンツをドラッグ&ドロップ
private void ReceiveOrderJLForm_Load(object sender, EventArgs e) { this.pager1.PageCurrent = 1; this.pager1.Bind(); } private int dgvBind() { WindowsApp.MyControl.PageData pageData = new WindowsApp.MyControl.PageData(); pageData.TableName = "T_ReceiveOrder"; pageData.PrimaryKey = "ReceiveOrderID"; pageData.OrderStr = "ReceiveOrderID desc"; pageData.PageIndex = this.pager;1.現在のページ; pageData.PageSize = this.pager1.PageSize; pageData.QueryCondition = _strSql + strWhere.ToString(); pageData.QueryFieldName = "*"; this.pager1.bindingSource.DataSource = pageData.QueryDataTable().Tables[0]; this.pager1.bindingNavigator.BindingSource = pager1.bindingSource; dgvReceiveOrder.AutoGenerateColumns = false; dgvReceiveOrder.DataSource = this.pager1.bindingSource; return pageData.TotalCount; } private int pager1_EventPaging(WindowsApp.MyControl.EventPagingArg e) { return dgvBind(); }
効果は以下の通りです
ソースコードのダウンロード:http://xiazai.jb51.net/201609/yuanma/winformPager(jb51.net).rar
これがこの記事の全てです。皆様の学習に役立てば幸いです。皆様のサポートをよろしくお願いします。
声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされたものであり、このサイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害を疑う内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、このサイトは即座に侵害を疑われるコンテンツを削除します。)