2009/09/08

GridViewのRowCommandイベントにて行の情報を取得する

このエントリーをはてなブックマークに追加
ASP.NETに搭載されているGridViewコントロールの使い方です。大量データを扱う必要となったときに、重宝するコントロールです。

便利だけど、知らないと出来ないことが多すぎて、よく使っているけれど、いまだ全貌は見えずというのが正直なところ。

一列目のID列の情報を取得する


一例として、GridViewの一列目にID列があって、各行の右サイドにボタンを並べ、クリックするその行の編集画面に飛ぶような仕組みを考えます。その先の編集画面までつくらないといけないので、はっきり言って面倒ではありますが、閲覧と編集の役割を分けることができるのでGUI的にもメリットはあります。

取得したいBoundFieldが一番左にあることが前提です

ソースコード
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
    if (e.CommandName == "command") {
        int rowIndex = Convert.ToInt16(e.CommandArgument);
        GridView gridView = (GridView)e.CommandSource;
        GridViewRow row = gridView.Rows[rowIndex];
        string id = row.Cells[0].Text;

        // そのあとの処理
    }
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) {
    e.Row.Cells[0].Visible = false; // 非表示にする場合
}


  • ButtonFieldのCommandNameに設定した値が、e.CommandNameに対応します。各行にボタンが複数ある場合も判別できます。
  • e.CommandArgumentでもって行の位置を取得して、Cells[0]で列を指定して情報を取得することができます。
  • ID行を表示させたくないときは、RowDataBoundイベントでデータが渡ってからVisible=falseとすると非表示にできます。デフォルトからVisible=falseとかすると、データが渡らないまま、空データになりますのでご注意。


それでも、Cells[0]なんていう直接的な指定がずっと気持ち悪いです。
なんとかできないもんでしょうかね。

取得したいフィールドがTemplateFieldの場合


TemplateFieldに配置したコントロールの値を取得したいとします。

ソースコード
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
    if (e.CommandName == "command") {
        int rowIndex = Convert.ToInt16(e.CommandArgument);
        GridView gridView = (GridView)e.CommandSource;
        GridViewRow row = gridView.Rows[rowIndex];
        DropDownList dropDownList = (DropDownList)row.FindControl("dropDownList");

        // そのあとの処理
    }
}

  1. FindControlを使用して、TemplateField内のコントロール名を指定することで、指定したコントロールが取得できます。ソース上ではDropDownListです。

0 件のコメント :

コメントを投稿