DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データグリッドビューのページ処理について

環境/言語:[Vista]
分類:[.NET]

データグリッドビューでページ処理を行いたいのですが、
どこをいじってやればいいのかわかっておりません。

下記のソースでテーブルは表示されますが、
5件だけ表示させるといった場合どうされてますか?
ページ毎にSQLを発行してやらないと無理でしょうか?

SQLをいじらないで5件表示させてボタンを押せば次の5件を表示させると
いった処理をどうすればいいのかご教授願います。

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim cn As New OleDb.OleDbConnection
Dim strSql As String
Dim dAdp As New OleDb.OleDbDataAdapter
Dim Table As New DataTable()
Dim BindingSource1 As New BindingSource

cn.ConnectionString = "『』"
strSql = "SELECT * FROM T_商品"
dAdp = New OleDb.OleDbDataAdapter(strSql, cn)
dAdp.Fill(Table)
BindingSource1.DataSource = Table
DataGridView1.DataSource = BindingSource1

End Sub
End Class
■No23006に返信(たかおさんの記事)
> SQLをいじらないで5件表示させてボタンを押せば次の5件を表示させると
> いった処理をどうすればいいのかご教授願います。

一番簡単なのは、BindingSourceのFilterプロパティを使うことでしょうか。
> 一番簡単なのは、BindingSourceのFilterプロパティを使うことでしょうか。

テーブルに連番をもっていない場合のFilterの条件指定ってどうしたらいいのでしょうか?
連番を自分で振ってやってID<=5みたいにするのですか?
自分で連番を振る方法もわからないんでどうやって振ればいいのでしょうか?
■No23008に返信(たかおさんの記事)
>>一番簡単なのは、BindingSourceのFilterプロパティを使うことでしょうか。
> 
> テーブルに連番をもっていない場合のFilterの条件指定ってどうしたらいいのでしょうか?
> 連番を自分で振ってやってID<=5みたいにするのですか?
> 自分で連番を振る方法もわからないんでどうやって振ればいいのでしょうか?

具体的に「5件」表示させる条件が明記されていませんが、
文面からするに単純に、最初は上から1件目〜5件目、ボタンを押したら次の6件目〜10件目、と表示させたいということでしょうか?

とりあえず「連番」と出たので連番でのやり方の例を示しておきます。

その場合、逐一手動で連番をふることも可能ですが、
Load時にDBとのやりとりをしているので、それだとパフォーマンスが落ちてしまうでしょう。
それよりかは、事前にテーブルに連番用の列を追加し、ボタンを押すごとに
BindingSourceのFlterを変更していく方がよいと思います。

--- イメージコード ---
※フォームにはDataGridViewとButton、BindingSourceが1つずつあるだけ。
※DataGridViewのみ、AllowUserAddRows・AllowUserDeleteRowsをFalseに設定。他はデフォルトのまま。

Public Class Form1

    Dim testtable As DataTable = New DataTable()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        testtable = GetData()

        Me.BindingSource1.DataSource = testtable
        Me.BindingSource1.Filter = "SortKey > 0 and SortKey < 6"
        Me.DataGridView1.DataSource = Me.BindingSource1
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim rowView As DataRowView = DirectCast(Me.DataGridView1.Rows(Me.DataGridView1.RowCount - 1).DataBoundItem, DataRowView)
        Dim row As DataRow = DirectCast(rowView.Row, DataRow)

        Me.BindingSource1.Filter = "SortKey > " & row("SortKey").ToString() & " and SortKey < " & (row("SortKey") + 5).ToString()


    End Sub

    Private Function GetData() As DataTable
        Dim table As DataTable = New DataTable()

        table.Columns.Add("C1")
        table.Columns.Add("C2")
        table.Columns.Add("C3")
        table.Columns.Add("SortKey")'←テーブルに事前に連番用の列を作っておく

        table.Rows.Add("sss", "111", "bbb", "1")
        table.Rows.Add("eee", "rrr", "766", "2")
        table.Rows.Add("err", "nnn", "999", "3")
        table.Rows.Add("bbb", "666", "888", "4")
        table.Rows.Add("ddd", "fff", "jjj", "5")
        table.Rows.Add("xxx", "vvv", "999", "7")
        table.Rows.Add("ggg", "hhh", "ert", "8")
        table.Rows.Add("333", "566", "hjj", "9")
        table.Rows.Add("www", "dfg", "ggg", "10")
        table.Rows.Add("hjh", "hjk", "www", "11")
        table.Rows.Add("222", "444", "ffg", "12")
        Return table
    End Function
End Class

これはテスト用に型のないDataTableで行っていますが、
考え方は型の有無にかかわらず同じです。
GetDataの部分は、実際はSQLのSelect文で行われる処理だと思ってください。

DOBON.NET | プログラミング道 | プログラミング掲示板