none
GridViewのページ送りで表示されない。 RRS feed

  • 質問

  • GridViewでページ送りを押すと、表が表示されなくなります。

     

    PageIndexChangingイベントとPageIndexChangedイベントが発生いたしません。

     

    AllowPaigingはTrueにしてます。

     

    データーもカラムもaspx.vbで動的に設定してます。

     

    Code Snippet

    Private Sub GridDspTest()


            Dim wktbl As New DataTable()
            Dim wkrow As DataRow
            '型割名
            Dim wsKtwr As String = ""
            'ワークインデックス
            Dim wiIdx As String = ""

            'データーカラムコレクション
            Dim columns As DataColumnCollection
            'データーカラム
            Dim column As DataColumn

     


            wktbl.Columns.Add("y/x")
            wktbl.Columns.Add("x1.min~x1.max")
            wktbl.Columns.Add("x2.min~x2.max")
            wktbl.Columns.Add("x3.min~x3.max")
            wktbl.Columns.Add("x4.min~x4.max")


            wkrow = wktbl.NewRow
            wkrow.Item("y/x") = "y1.min~y1.max"

            wkrow.Item("x1.min~x1.max") = "100"
            wkrow.Item("x2.min~x2.max") = "110"
            wkrow.Item("x3.min~x3.max") = "110"
            wkrow.Item("x4.min~x4.max") = "120"
            wktbl.Rows.Add(wkrow)

            wkrow = wktbl.NewRow
            wkrow.Item("y/x") = "y2.min~y2.max"

            wkrow.Item("x1.min~x1.max") = "100"
            wkrow.Item("x2.min~x2.max") = "200"
            wkrow.Item("x3.min~x3.max") = "300"
            wkrow.Item("x4.min~x4.max") = "400"
            wktbl.Rows.Add(wkrow)

            wkrow = wktbl.NewRow
            wkrow.Item("y/x") = "y3.min~y3.max"

            wkrow.Item("x1.min~x1.max") = "100"
            wkrow.Item("x2.min~x2.max") = "150"
            wkrow.Item("x3.min~x3.max") = "300"
            wkrow.Item("x4.min~x4.max") = "400"
            wktbl.Rows.Add(wkrow)


            wkrow = wktbl.NewRow
            wkrow.Item("y/x") = "y4.min~y4.max"

            wkrow.Item("x1.min~x1.max") = "100"
            wkrow.Item("x2.min~x2.max") = "200"
            wkrow.Item("x3.min~x3.max") = "300"
            wkrow.Item("x4.min~x4.max") = "400"
            wktbl.Rows.Add(wkrow)


            wkrow = wktbl.NewRow
            wkrow.Item("y/x") = "y5.min~y5.max"

            wkrow.Item("x1.min~x1.max") = "300"
            wkrow.Item("x2.min~x2.max") = "200"
            wkrow.Item("x3.min~x3.max") = "300"
            wkrow.Item("x4.min~x4.max") = "400"
            wktbl.Rows.Add(wkrow)


            columns = wktbl.Columns


            For Each column In columns
                Dim wbtn1 As ButtonField = New ButtonField

                'ヘッダーテキスト取得
                wbtn1.ButtonType = ButtonType.Button
                wbtn1.HeaderText = column.Caption
                wbtn1.DataTextField = column.ColumnName
                wbtn1.CommandName = column.Ordinal.ToString()
                GridView1.Columns.Add(wbtn1)


            Next column

     

            GridView1.DataSource = wktbl


            GridView1.DataBind()

     

     

     

        End Sub

     

     

    Page_Initで毎回DataBindすれば表示するのですが、それはちょっと、関係ないコントロールのポストバックでも走るので、

    ちゃんとPageIndexChangingイベントかPageIndexChangedのイベントの中で、DataBindしなおしたいのです。

     

    他にもいい方法もあるかもしれませんが、御助言よろしくお願いします。

     

    2009年1月8日 6:44

回答

  • 自己レスです。

    ページング押下でDataBindingのイベントが発生しました。

    DataBindingの中で何らかのフラグで制御しながら、一回だけバインドし直せば、上手くいきました。

     

    なんか強引な気がしますけど、他にいい方法がありましたら。お教え願います。

     

     

    2009年1月9日 2:48

すべての返信

  • > GridViewでページ送りを押すと、表が表示されなくなります。

     

    「ページ送り」って何ですか? 

     

    GridView.PageIndexChanging, GridView.PageIndexChanged イベントは GridView の
    ページャボタンをクリックしたとき発生しますが、そもそも、このコード例では1ページのみ

    しかないのでページングは不要ですし、AllowPaiging="True" にしてもページャボタンは

    表示されないはずですが。

     

    何か考え違いがあるような気がします・・・

     

    一体何をしたいのか良くわかりません。そのあたりをもう少し詳しく説明してもらえると、お

    役に立てるかもしれません。

     

    2009年1月8日 15:50
  • 説明不足ですみません。実際セットするデーターは、たくさんあるのですが、サンプルには公開できないので固定値でセットの

    ロジックですが、本来は18行くらいあります。

     

    PageButtonCount="5"にしてるので、3頁あるのですが。GridViewの最下位のページャーを押したら、表の表示がなくなります。

     

    毎回Page_Initでバインドすると表示されるのですが、ページャーを押した時は表示して、条件指定のDropDownListを変更したときは、GridViewはクリアーされていいのですが。

     

    切り分けをGridView.PageIndexChanging, GridView.PageIndexChangedでひろって、バインドしなおせば、ページングのときだけ

    表示できるかなとかんがえたのですが、イベント自体が発生しないです。

     

    なにか、いい方法ありませんでしょうか?

     

     

     

     

    2009年1月8日 23:40
  • 自己レスです。

    ページング押下でDataBindingのイベントが発生しました。

    DataBindingの中で何らかのフラグで制御しながら、一回だけバインドし直せば、上手くいきました。

     

    なんか強引な気がしますけど、他にいい方法がありましたら。お教え願います。

     

     

    2009年1月9日 2:48
  • 先のスレッド「GridViewのセル選択イベント取得方法」で書いた "方法1" の場合は、
    DataTable を作成するメソッドと GridView の間を ObjectDataSource で仲介してや
    れば簡単に Paging が実装できるのですが、"方法2" ではその手は使えないようで

    す。

     

    単に GridView のプロパティで AllowPaging="True" としただけでは、エラーになる

    はずですが、TAKAPI さんのやり方では何故かうまくいったとのことで、どこか根

    的に違うのかもしれませんね。

     

    ところで、RowCommand で取得できる行の Index は、ページングした場合、例え

    ば1ページ目の n 行と、2ページ目の n 行とで同じになりますが、その点は理解さ

    れているでしょうか?

    2009年1月9日 15:08
  • RowCommandのindexは1ページ目のn行と2ページ目のn行で同じになることは知りませんでした。

    選択行数=(ページ数-1)×(1ページの行数) + Indexとかで、計算してやってみようかなと考えています。

     

    2009年1月12日 1:10