none
GridViewでページャーとボタンリンク列のクリック判別 RRS feed

  • 質問

  • 現在ASP.NETでGridViewのRowCommandイベントでGridViewでページャーとリスト部分にあるボタンリンク列のクリック判別ができず困っています。何か良い方法はありますか?
    2014年2月20日 4:50

回答

  • GridView で AllowPaging="True" として標準のページャーを表示しているのだと思いますが、そうであれば、以下のページに書いてありますように、ページャーのリンクボタンの CommandName は "Page" になります。

    GridView.RowCommand イベント
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.rowcommand(v=vs.80).aspx

    なので・・・

    > GridViewにButtonField列を作り(ButtonTypeはLink)そこに一意のIDを表示させています。

    ・・・の ButtonField.CommandName プロパティに別の適当な名前をつければ、GridView.RowCommand イベントのハンドラで GridViewCommandEventArgs.CommandName プロパティを見れば識別できます。

    例えば、ButtonField.CommandName プロパティを "ProductID" と設定したとすれば、以下のようにすれば識別できます。

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "ProductID")
        {
            // 各行のリンクボタンがクリックされた時の処置
        }
        else if (e.CommandName == "Page")
        {
            // ページャーがクリックされた時の処置
        }
        else
        {
            // その他のボタンがクリックされた時の処置
        }
    }

    #以下のページの例のように ModalPopup を使って、全ての操作を同一ページ内で行って、見かけは 2 画面で行うようにする方が簡単かもしれません。ご参考まで。

    ModalPopup で編集・更新操作
    http://surferonwww.info/BlogEngine/post/2010/10/14/Select-edit-and-update-using-2-pages.aspx

    • 回答としてマーク 星 睦美 2014年2月25日 1:46
    2014年2月20日 7:38

すべての返信

  • ご自分の環境(OS, .NET, IIS, Visual Studio のバージョン、使っているブラウザは何かなど)ぐらいは書いていただけませんか?

    あと、ページャーをどうやって作ったか、「リスト部分にあるボタンリンク列」とは GridView のどこにどのように作って配置したのか、回答者やあなた以外の閲覧者はここに書いてあること以外は何も知りえないということを意識して、できるだけ具体的に書いていただけませんか?

    それから、できれば、この質問に至る背景、何故どのボタンがクリックされたかを判別する必要があるかなどを書いていただけると、場合によってはより目的に適った解決策の提案ができるかもしれません。

    2014年2月20日 6:24
  • 返信ありがとうございます。

    現在、ページングを有効にしたGridView(データ行10件設定)のある画面Aで一行選択し、FormViewのある画面Bに遷移させて詳細を表示し、元の画面Aに戻る際、選択した行を表示させたいと思っています。画面Aと画面Bは一意のIDで紐づいています。GridViewの元データはAccessでレコード数は数万件程度です。

    GridViewにButtonField列を作り(ButtonTypeはLink)そこに一意のIDを表示させています。ButtonFiled列をクリックしたタイミングでGridViewのPageIndexやクリックされたIDを画面Bに渡し、画面Bから画面Aに戻る際、そのPageIndexを画面Aに戻そうと思っているので、RowCommandイベントプロシージャで

            Dim index As Integer = CInt(e.CommandArgument)
            Dim row As GridViewRow = GridView1.Rows(index) ←←←※

            Dim RefnoCell As TableCell = row.Cells(0)
            Dim selno As String = CType(RefnoCell.Controls(0), LinkButton).Text

        Response.Redirect("画面B.aspx?id=" & selno & "&page=" & Me.GridView1.PageIndex.ToString

    のような感じで選択されたIDとPageIndexをクエリ文字列で渡したいんです。

    しかし、ページャでたとえば10以上のリンク「・・・」をクリックするとRowCommandイベントプロシージャ内で10以上のindexが返りその結果、配列の要素オーバーが上記「※」で起きてしまって困っています。

    なので、ページャをクリックしたのかButtonFiled列をクリックしたのかを判別できればいいなと思っています。

    OSはWindows 7、Visual Studio 2005、.NET2.0です。

    よろしくお願いします。

    2014年2月20日 6:58
  • GridView で AllowPaging="True" として標準のページャーを表示しているのだと思いますが、そうであれば、以下のページに書いてありますように、ページャーのリンクボタンの CommandName は "Page" になります。

    GridView.RowCommand イベント
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.rowcommand(v=vs.80).aspx

    なので・・・

    > GridViewにButtonField列を作り(ButtonTypeはLink)そこに一意のIDを表示させています。

    ・・・の ButtonField.CommandName プロパティに別の適当な名前をつければ、GridView.RowCommand イベントのハンドラで GridViewCommandEventArgs.CommandName プロパティを見れば識別できます。

    例えば、ButtonField.CommandName プロパティを "ProductID" と設定したとすれば、以下のようにすれば識別できます。

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "ProductID")
        {
            // 各行のリンクボタンがクリックされた時の処置
        }
        else if (e.CommandName == "Page")
        {
            // ページャーがクリックされた時の処置
        }
        else
        {
            // その他のボタンがクリックされた時の処置
        }
    }

    #以下のページの例のように ModalPopup を使って、全ての操作を同一ページ内で行って、見かけは 2 画面で行うようにする方が簡単かもしれません。ご参考まで。

    ModalPopup で編集・更新操作
    http://surferonwww.info/BlogEngine/post/2010/10/14/Select-edit-and-update-using-2-pages.aspx

    • 回答としてマーク 星 睦美 2014年2月25日 1:46
    2014年2月20日 7:38
  • 的確な回答ありがとうございます。

    おっしゃる通り、CommandNameで判別する事が可能であることが理解できました。

    まだまだ勉強不足ですね。努力しないと。。。

    本当にありがとうございました。

    2014年2月20日 7:47