質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

3回答

15296閲覧

Windowsフォーム DataGridViewでのページング

nobureon2

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2020/05/07 08:33

編集2020/05/12 01:51

前提・実現したいこと

Windowsフォームのdatagridviewで、ページング処理を実装したいのですが、
良いサンプルはないでしょうか?
いくらか検索しましたが、該当のものが見つかりません。

・既存プログラム改修のため、WindowsForm+dataGridviewの組み合わせは変更したくない
・表示データ件数が増加したため、ページング機能を実装することとなった

補足情報(FW/ツールのバージョンなど)

それらしきページのリンクがあったのですが、リンク切れでした。

https://dobon.net/vb/bbs/log3-29/17906.html

追記

以下を参考に書いてみました。
期待通りの動作になりました。

https://stackoverflow.com/questions/2825771/how-can-we-do-pagination-in-datagridview-in-winform

イメージ説明
イメージ説明

C#

1// 2 3using System; 4using System.Collections.Generic; 5using System.ComponentModel; 6using System.Data; 7using System.Drawing; 8using System.Linq; 9using System.Text; 10using System.Threading.Tasks; 11using System.Windows.Forms; 12using System.IO; 13 14namespace DataGridPaging 15{ 16 public partial class Form1 : Form 17 { 18 public DataTable dataTable = new DataTable(); 19 public BindingSource bindingSource = new BindingSource(); 20 public BindingList<DataTable> tables = new BindingList<DataTable>(); 21 22 // 1ページで表示する行数 23 public int pageSize = 1000; 24 25 public Form1() 26 { 27 InitializeComponent(); 28 29 // データサンプル(10000行) 30 // 以下の型式で10000行 31 // 1,行1,hoge1,fuga2,aaaaaaaaaaaaaaaaaaaa1 32 ReadData(); 33 } 34 35 public void ReadData() 36 { 37 this.dataTable.Columns.Add("列1", typeof(string)); 38 this.dataTable.Columns.Add("列2", typeof(string)); 39 this.dataTable.Columns.Add("列3", typeof(string)); 40 this.dataTable.Columns.Add("列4", typeof(string)); 41 this.dataTable.Columns.Add("列5", typeof(string)); 42 43 using(StreamReader sr = new StreamReader(@"data.csv", System.Text.Encoding.GetEncoding("shift_jis"))) 44 { 45 while(!sr.EndOfStream) 46 { 47 var line = sr.ReadLine(); 48 var datas = line.Split(','); 49 50 dataTable.Rows.Add(datas[0], datas[1], datas[2], datas[3], datas[4]); 51 } 52 } 53 54 } 55 56 private void button1_Click(object sender, EventArgs e) 57 { 58 SetPagedDataSource(); 59 } 60 61 private void SetPagedDataSource() 62 { 63 DataTable dt = null; 64 int counter = 1; 65 66 foreach (DataRow dr in this.dataTable.Rows) 67 { 68 if (counter == 1) 69 { 70 dt = dataTable.Clone(); 71 tables.Add(dt); 72 } 73 74 dt.Rows.Add(dr.ItemArray); 75 76 if (pageSize < ++counter) 77 { 78 counter = 1; 79 } 80 } 81 82 this.bindingNavigator1.BindingSource = bindingSource; 83 bindingSource.DataSource = tables; 84 bindingSource.PositionChanged += bindingSource_PositionChanged; 85 bindingSource_PositionChanged(bindingSource, EventArgs.Empty); 86 } 87 88 private void bindingSource_PositionChanged(object sender, EventArgs e) 89 { 90 this.dataGridView1.DataSource = tables[bindingSource.Position]; 91 } 92 } 93} 94

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/07 08:41

ページングという処理を、もう少し具体的に説明してください。 (〇〇をしたら〇行移動させたい等)
Zuishin

2020/05/07 08:46

ページングはありません。スクロールバーを使ってください。もしかすると「仮想モード」で解決するかもしれません。
Zuishin

2020/05/07 08:56

バインドするデータを変えてもいいのであれば、ページごとに分割したデータをバインドしてボタンで切り替えればいいでしょう。
nobureon2

2020/05/07 09:12

ありがとうございます。 分割した場合の不都合ってありますか? 検索がページごとになるとかでしょうか。
Zuishin

2020/05/07 09:22

検索をどう実装するかによってはそうなるかもしれませんが、それは対処可能だと思います。 不都合については、ソフトの詳細を知らないので、わかりません。表示されているのがデータの一部分なので、それを考慮した実装になっていればいいと思います。
退会済みユーザー

退会済みユーザー

2020/05/07 09:24

検索の都度SQL走らせないといけないとか、そのへんですかね。 そもそもデータをDBで持ってるかどうかにもよりますが。
nobureon2

2020/05/07 10:08

データはDBで持っています。 都度、問合せするしかなさそうですね。 そうしてみます。
guest

回答3

0

ベストアンサー

あまりいい回答ではないんですが、無理やりCountを設定してやることで期待通りの動きをしているような気がしました。
変更箇所には「変更箇所」のコメントを書いています。

cs

1 public partial class Form1 : Form { 2 public DataTable dataTable = new DataTable(); 3 public BindingSource bindingSource = new BindingSource(); 4 public BindingList<DataTable> tables = new BindingList<DataTable>(); 5 6 // 1ページで表示する行数 7 public int pageSize = 1000; 8 9 //***************変更箇所*************** 10 public int dataCount = 0; 11 12 public Form1() { 13 InitializeComponent(); 14 15 // データサンプル(10000行) 16 // 以下の型式で10000行 17 // 1,行1,hoge1,fuga2,aaaaaaaaaaaaaaaaaaaa1 18 ReadData(); 19 } 20 21 public void ReadData() { 22 this.dataTable.Columns.Add("列1", typeof(string)); 23 this.dataTable.Columns.Add("列2", typeof(string)); 24 this.dataTable.Columns.Add("列3", typeof(string)); 25 this.dataTable.Columns.Add("列4", typeof(string)); 26 this.dataTable.Columns.Add("列5", typeof(string)); 27 28 using (StreamReader sr = new StreamReader(@"data.csv", System.Text.Encoding.GetEncoding("shift_jis"))) { 29 while (!sr.EndOfStream) { 30 //***************変更箇所*************** 31 dataCount++; 32 33 var line = sr.ReadLine(); 34 var datas = line.Split(','); 35 36 dataTable.Rows.Add(datas[0], datas[1], datas[2], datas[3], datas[4]); 37 } 38 } 39 40 } 41 42 private void button1_Click(object sender, EventArgs e) { 43 SetPagedDataSource(); 44 } 45 46 private void SetPagedDataSource() { 47 DataTable dt = null; 48 int counter = 1; 49 50 foreach (DataRow dr in this.dataTable.Rows) { 51 if (counter == 1) { 52 dt = dataTable.Clone(); 53 tables.Add(dt); 54 } 55 56 dt.Rows.Add(dr.ItemArray); 57 58 if (pageSize < ++counter) { 59 counter = 1; 60 } 61 } 62 63 this.bindingNavigator1.BindingSource = bindingSource; 64 bindingSource.DataSource = tables; 65 bindingSource.PositionChanged += bindingSource_PositionChanged; 66 bindingSource_PositionChanged(bindingSource, EventArgs.Empty); 67 } 68 69 private void bindingSource_PositionChanged(object sender, EventArgs e) { 70 this.dataGridView1.DataSource = tables[bindingSource.Position]; 71 //***************変更箇所*************** 72 //this.bindingSource.DataSource = tables[bindingSource.Position]; 73 //不要でしたbindingNavigator1.CountItem.Text = "/ "+(dataCount / pageSize).ToString(); 74 } 75 }

投稿2020/05/11 15:27

編集2020/05/11 15:51
Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobureon2

2020/05/12 01:48

ありがとうございます。 コメントアウトされているので、つまりこの行がいらないということですね。 期待通りの動作となりました、ありがとうございます! this.bindingSource.DataSource = tables[bindingSource.Position];
Hey_CH

2020/05/12 07:22

そうですね、ただ、やってみたらそうなったって感じなので、弱気発言をしていますw
guest

0

以下の記事に「ページ当たりの行数」と「表示するページ番号」を指定して該当するページのレコードを取得するストアドプロシージャのコードがあります。それの応用でできないか考えてみてはいかがですか?

カスタムページャー
http://surferonwww.info/BlogEngine/post/2010/08/25/Custom-pager.aspx

ASP.NET Web アプリでは間違いなくできますが、Windows Forms の DataGridView では自分は未確認・未検証ですので、できなかったらすみません。

投稿2020/05/07 09:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobureon2

2020/05/07 10:09

ありがとうございます。 すいません、私ではWindowsFormへ応用することは難しそうです。。
退会済みユーザー

退会済みユーザー

2020/05/07 11:29 編集

では、全レコードを取得して DataTable に保持し、それから DataGridView に表示する部分のみ切って取得するとか? Web アプリではそういうのは無理ですが、Windows アプリでは問題なくできると思いますけど。 または、ページ別の DataTable を作成して、ページャーでそれを切り替えて DataGridView に表示するとか?
退会済みユーザー

退会済みユーザー

2020/05/07 11:27

ASP.NET Web Forms アプリのサーバーコントロールのように、組み込みのページング機能を期待しているとすると、そういうのは DataGridView にはなさそうです。 なので、自分でコードを書いてページング機能を実現するスキルがないなら諦めざるを得ないかと思います。
guest

0

いまいち質問がはっきりしませんが、、

タブコントロールにDataGridViewを貼り付けて、タブ選択のイベントでデータを書き換えるってことでどんなもんでしょう

投稿2020/05/07 08:54

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問