トップ回答者
GridViewで、ページングを有効にした場合のフィールドのVisible設定

質問
-
お世話になっております。
現在、以下の環境で、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:56 誤字
回答
-
> 今回、この処理と併用して、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
すべての返信
-
> 今回、この処理と併用して、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
-
質問時に、記述漏れがあったのですが(申し訳ありません…)、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イベントを使った場合も、同様の処理ができるかどうか、動作検証をしてみたいと思います。
回避策のアドバイス、ありがとうございました!