none
GridViewで、ページングを有効にした場合のフィールドのVisible設定 RRS feed

  • 質問

  • お世話になっております。
    現在、以下の環境で、Webアプリケーション開発を行っています。
      OS  : Windows Vista
      開発環境 : Visual Studio 2008 (C#)

    GridViewの、一部のフィールドを、条件によって表示・非表示に設定したいので、
    GridViewのRowCreatedイベント内で、以下の様な処理を追加しています。

            protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
            {
               if (条件文)
               {  e.Row.Cells[1].Visible = false;  // フィールドを非表示にする  }
               else
               {  e.Row.Cells[1].Visible = true;   // フィールドを表示する  }
            }


    今回、この処理と併用して、GridViewの「ページング」を「有効」にしたいのですが、
    ページングを有効にした場合、
    「指定された引数は、有効な値の範囲内にありません」 というエラーが発生します。
    (エラー箇所は、2ページ目に入ったあたりだと思うのですが)

    ページングを有効にする場合に、GridViewの列の表示・非表示設定を行うには、
    どのイベント・どのタイミングで記述をすればよいでしょうか?


    ご教授のほど、よろしくお願いします。

    2010年2月4日 5:55

回答

  • > 今回、この処理と併用して、GridViewの「ページング」を「有効」にしたいのですが、
    > ページングを有効にした場合、
    > 「指定された引数は、有効な値の範囲内にありません」 というエラーが発生します。
    > (エラー箇所は、2ページ目に入ったあたりだと思うのですが)

    GridView1_RowCreated で、GridViewRow.RowType に関わらず、1列上から下ま
    で全部 e.Row.Cells[1]... としたのですよね?

    ページングが有効になっている場合、自動的にページ行が追加されますが、その中には
    TableCell は一つしかないです(即ち、e.Row.Cells.Count は 1 です)。

    そこで e.Row.Cells[1]... としたから、

    > 「指定された引数は、有効な値の範囲内にありません」 というエラーが発生します。

    ということになったのだと思います。

    それが原因なら、回避策は、例えば以下のようにすることです。

    if (e.Row.RowType != DataControlRowType.Pager)
    {
        if (条件文)
        {
            e.Row.Cells[1].Visible = false;  // フィールドを非表示にする
        }
        else
        {
            e.Row.Cells[1].Visible = true;   // フィールドを表示する
        }
    }

    • 回答としてマーク 江藤健二 2010年2月6日 0:35
    2010年2月4日 13:06

すべての返信

  • ページを移動したときに発生するんですか?

    たしかGridViewでページを移動すると、一度元のデータがバインドされて、その後遷移先のデータがバインドされるような動きをしていたと思います。
    もしかするとそのせいかもしれませんね。

    データのバインドが完了してからなら操作しても大丈夫だと思うので、GridViewのPreRenderイベントで操作すればいいんじゃないでしょうか。
    まぁ、このイベントはほとんど最後に発生するんですけどね。。。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2010年2月4日 7:27
  • > 今回、この処理と併用して、GridViewの「ページング」を「有効」にしたいのですが、
    > ページングを有効にした場合、
    > 「指定された引数は、有効な値の範囲内にありません」 というエラーが発生します。
    > (エラー箇所は、2ページ目に入ったあたりだと思うのですが)

    GridView1_RowCreated で、GridViewRow.RowType に関わらず、1列上から下ま
    で全部 e.Row.Cells[1]... としたのですよね?

    ページングが有効になっている場合、自動的にページ行が追加されますが、その中には
    TableCell は一つしかないです(即ち、e.Row.Cells.Count は 1 です)。

    そこで e.Row.Cells[1]... としたから、

    > 「指定された引数は、有効な値の範囲内にありません」 というエラーが発生します。

    ということになったのだと思います。

    それが原因なら、回避策は、例えば以下のようにすることです。

    if (e.Row.RowType != DataControlRowType.Pager)
    {
        if (条件文)
        {
            e.Row.Cells[1].Visible = false;  // フィールドを非表示にする
        }
        else
        {
            e.Row.Cells[1].Visible = true;   // フィールドを表示する
        }
    }

    • 回答としてマーク 江藤健二 2010年2月6日 0:35
    2010年2月4日 13:06
  • 返信ありがとうございます。

    PreRenderイベントで、以下の様に非表示設定を行ったところ、ページが切り替わっても、エラーが発生しなくなりました。

            protected void GridView1_PreRender(object sender, EventArgs e)
            {
                GridView1.Columns[1].Visible = false; 
             }


    PreRenderイベントは、実はこれまで使用したことがなかったので、これを機に動作を確認してみようと思います!

    2010年2月6日 0:45
  • 質問時に、記述漏れがあったのですが(申し訳ありません…)、SurferOnWww様のご指摘通りです。

    if (e.Row.RowType != DataControlRowType.Pager) で、処理を囲んだら、該当のエラーが出なくなりました。


    補足です。
    今回、行いたい処理が、
      (1) 条件によって、フィールドを表示・非表示に切り替える
      (2) GridViewの「選択」を有効にし、選択ボタンを押した際に指定行のデータを取得する
         (SelectedIndexChangedイベント内では、以下の処理を行っています
                  GridViewRow row = GridView1.SelectedRow;
                  string data = row.Cells[1].Text;
     )

    という2点の組み合わせだったのですが、(2)の処理を実行する場合、
    RowCreatedで表示・非表示設定を行えば、SelectedIndexChangedイベント内でGridViewのデータが取得できたので、
    こちらの回避策を参考にさせて頂こうと思います!

    PreRenderイベントを使った場合も、同様の処理ができるかどうか、動作検証をしてみたいと思います。

    回避策のアドバイス、ありがとうございました!

    2010年2月6日 1:13