none
gridview のページング について RRS feed

  • 質問

  • asp.net(vb.net)の勉強中ですが、gridviewのページングを有効にしたところ、正しく表示ができませんでした。詳細は以下になります。

    画面が二つあります。①一覧表(index)②追加画面(addList)

    一覧表画面にgridviewがあり、gridviewのページングを有効にしています。 5ページ(20行)あり、商品IDでソートしています。

    一覧表の画面に「新しい商品の追加」のボタンがあり、そのボタンを押下すると別の画面(追加画面)が表示されます。

    追加画面で項目の入力をし、追加ボタンを押下すると、一覧表画面に戻ります。そのとき、追加したレコードを反転し、新しいレコードがあるページを表示したいですが、いつもページ1(最初のページ)だけ表示されます。

    追加されたレコードのページを最初に表示したい場合はどこに設定しますか?(参考になるURLがあれば是非.....,)

    わかる方、ご教授おねがいします。
    以上です。

    2010年9月28日 5:17

回答

  • trapemiya さんの回答にすべて答えがあると思います(反転表示以外)。

    'これは一覧表側のコードになります。
    Dim rowNum As Integer = 追加した商品IDの行位置 'SQLなどで取得。先頭行は1です。
    GridView1.PageIndex = (rowNum - 1) ¥ GridView1.PageSize
    GridView1.DataBind() 'これは既存コード

    SQL は以下でもよいと思いました。

    select count(*) as [RowNum]
    from [商品テーブル]
    where [商品ID] <= 追加した商品ID

    ちなみに、もし ObjectDataSource などでのデータ取得時のページング機能は未使用でしたら、データはすべて取得済みになりますので、その DataTable.DefaultView などの Find メソッドを使って行位置を取得する方法もあると思いました。

    • 回答としてマーク sudipbaral 2010年9月29日 6:47
    2010年9月29日 3:45

すべての返信

  • 新しいレコードは何ページ目に表示されるのでしょうか? それを求めてGridViewのPageIndexプロパティにセットすれば良いはずです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月28日 7:05
    モデレータ
  • 新しいレコードは何ページ目に表示されるのでしょうか? それを求めてGridViewのPageIndexプロパティにセットすれば良いはずです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    GridViewのPageIndexプロパティは「0」ですが、新しいレコードの商品ID(商品IDでソート)によってページが変わります。

    どうすればいいでしょうか?

     

    2010年9月28日 7:37
  • SQL Server 2008をお使いでしょうか? であれば、ROW_NUMBERが使えますので追加されたレコードが何番目のレコードか簡単にわかります。それをGridViewのPageSizeプロパティの値で割れば何ページ目かわかりますので、それをPageIndexプロパティにセットすればいいはずです。

    (参考)
    ROW_NUMBER (Transact-SQL)
    http://msdn.microsoft.com/ja-jp/library/ms186734.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月28日 7:43
    モデレータ
  • access 2003を使っています。

    access データベースにいろいろなカテゴリーのデータがあります、そのデータベースから同じカテゴリーのレコードを取得し、一覧表のgridviewに表示しています。

    access も同じですか?

    2010年9月28日 7:46
  • SQL Serverなら以下のような感じになります。確かめていませんが、Accessも同じような感じでいいんじゃないかと思います。SQLの若干の修正が必要かもしれません。

    select T.No from ( select T1.商品ID as 商品ID,
                      (select COUNT(*) from 商品テーブル as T2 where T2.商品ID < T1.商品ID) + 1 as No
                       from 商品テーブル as T1) as T
                where T.商品ID = 新規に追加したレコードの商品ID


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月28日 8:05
    モデレータ
  • > 商品IDでソートしています。

    ソートした後、新たに挿入したレコードが最後の行になるなら、追加画面から
    一覧画面に遷移するときに最後のページが表示されるようにしたらいいのでは
    ないですか?

    そのレコードを反転表示するのはまた別の手段が必要ですが・・・

    2010年9月28日 13:22
  • > 商品IDでソートしています。

    ソートした後、新たに挿入したレコードが最後の行になるなら、追加画面から
    一覧画面に遷移するときに最後のページが表示されるようにしたらいいのでは
    ないですか?

    そのレコードを反転表示するのはまた別の手段が必要ですが・・・

    追加した商品IDはばらばらですので、いつも最後のページにはならないです。

    簡単なのかもしれませんが、知識が無くわかりません。
    お分かりの方、是非お願いいたします。

    2010年9月29日 0:05
  • trapemiya さんの回答にすべて答えがあると思います(反転表示以外)。

    'これは一覧表側のコードになります。
    Dim rowNum As Integer = 追加した商品IDの行位置 'SQLなどで取得。先頭行は1です。
    GridView1.PageIndex = (rowNum - 1) ¥ GridView1.PageSize
    GridView1.DataBind() 'これは既存コード

    SQL は以下でもよいと思いました。

    select count(*) as [RowNum]
    from [商品テーブル]
    where [商品ID] <= 追加した商品ID

    ちなみに、もし ObjectDataSource などでのデータ取得時のページング機能は未使用でしたら、データはすべて取得済みになりますので、その DataTable.DefaultView などの Find メソッドを使って行位置を取得する方法もあると思いました。

    • 回答としてマーク sudipbaral 2010年9月29日 6:47
    2010年9月29日 3:45
  • TH01さんと trapemiyaさんの回答が分かり安いでした。

    本当に有難うございます。

    2010年9月29日 6:17
  • SQL は以下でもよいと思いました。

    select count(*) as [RowNum]
    from [商品テーブル]
    where [商品ID] <= 追加した商品ID
    確かにそうですね。レコードに連番を振るわけじゃないですからこれで十分ですね。フォローありがとうございます。助かりました。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月29日 6:20
    モデレータ
  • > 追加した商品IDはばらばらですので、いつも最後のページにはならないです。

    条件は前のスレッド(下記)の続きですか?

    gridview の更新が出来ない。
    http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/c5c18de6-36a8-4ecd-b71f-2bd4fe31cad9

    つまり、追加画面でユーザーに「商品ID」を入力させ、ダブっていたら再入力を
    促すというような仕組みですか。

    それをやめて「商品ID」をオートナンバーにできませんか?

    そうすれば、「商品ID」でソートすれば、挿入したレコードが一番最後になるは
    ずです。(追加画面から一覧表画面に遷移する間に他の人が別のレコードを挿入
    しない限りですが)

    加えて、前のスレッドのコードで行っているようなダブリのチェックは不要に
    なるので、ユーザビリティも向上するはずです。

    さらにもう一つ。一覧表画面ではユーザーの選択で動的に「抽出条件」(WEHRE
    句の内容)が変化するのですよね? ということは、「抽出条件」によって、当
    該レコードが何番目になるかが変化するという面倒なことになると思います。そ
    ういう問題も、オートナンバーにすれば忘れていいはずです。


    どうしても前の条件は変えられない(オートナンバーにはできない)というこ
    とであれば、以下のような手順ではいかがでしょう。(未検証ですが)

    (1) 追加画面で INSERT 操作完了後、「商品ID」を一覧表画面に渡して遷移。

    (2) 必要な「抽出条件」を設定した後 AccessDataSource.Select で DataView
      を取得。

    (3) DataView を「商品ID」で検索して何レコード目にあるかを求める。

    (4) 1 ページ当りのレコード数と上記 (3) で何ページに当該レコードがあるか
      を求める。

    (5) そのページを GridView.PageIndex に指定。

    (6) GridView.SelectedRowStyle プロパティを「反転表示」に設定。

    (7) GridView.RowDataBound イベントのハンドラで当該レコードのある行を調べ、
      それから GirdViewRow.RowIndex を取得。

    (8) GridView.SelectedIndex に (7) で取得した RowIndex を設定。
    2010年9月29日 13:35