トップ回答者
GridViewのヘッダーを複数行表示にする方法 + 選択行の取得

質問
-
お世話になっております。
掲題の件について質問させてください。【問題】
・GridViewの複数行に変更する方法は正しいのか。 他にもあるのか。
・私が現在確認しているGridViewで、GridView内のボタンを押下すると、1レコードしたの行が選択された状態となってしまう。
【解決】
GridViewを複数行表示にしたうえで、選択した行が何かを判断する方法を教えて頂けないでしょうか。
(ヘッダー追加により、Indexがずれないような対応方法を教えて頂きたい)
以下、ソースになります。
※不必要と判断したソース・処理はけずっています。
※ヘッダーを複数行表示にしなければ選択行の取得はかのうですし、デバッグ表示も問題なく可能。
【aspx】
<asp:GridView ID="Grv" runat="server" AllowPaging="True"
AllowSorting="True" EnableModelValidation="True"
GridLines="Vertical" AutoGenerateColumns="False"
OnPageIndexChanging="Grv_PageIndexChanging" OnSorting="Grv_Sorting" OnPreRender="test">
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:ImageButton ID="btn" runat="server" CausesValidation="False" ImageUrl="../Images/test.png"
Text="ボタン" CommandArgument='<%# Bind("no") %>' OnClick="btn_Click"></asp:ImageButton>
</ItemTemplate>
<ItemStyle Width="20px" HorizontalAlign="Center"/>
</asp:TemplateField>
<asp:BoundField HeaderText="no" DataField="no" SortExpression="no">
<ItemStyle HorizontalAlign="Left" Width="80" />
</asp:BoundField>
</Columns>
</asp:GridView>◆補足
GridViewに『no』を表示し、イメージボタン押下時にnoの値を取得
※なぜかヘッダー追加により1行ずれる
【cs:Page_Load】
this.Grv.DataSource = GetData();
this.Grv.DataBind();◆補足
取得したデータをデータソースに反映して、バインド
【cs:PreRendar(test)】//ヘッダー行を宣言
GridViewRow row = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Alternate);
for (int i = 0; i < 19; i++)
{
TableCell cell1 = new TableCell();
cell1.ColumnSpan = 1;
cell1.Text = string.Empty;
//行にセルを追加
row.Cells.Add(cell1);
}
TableCell cell2 = new TableCell();
TableCell cell3 = new TableCell();
//colspan をプロパティ設定
cell2.ColumnSpan = 12;
cell3.ColumnSpan = 12;
//ヘッダーテキストを設定
cell2.Text = "ヘッダー1";
cell3.Text = "ヘッダー2";
//行にセルを追加
row.Cells.Add(cell2);
row.Cells.Add(cell3);
this.Grv.Controls[0].Controls.AddAt(1, row);【cs:ButtonClick】
ImageButton btn = sender as ImageButton;
if (btn == null)
{
return;
}
if (btn.CommandArgument == null || string.IsNullOrEmpty(btn.CommandArgument))
{
return;
}
- 編集済み kaijin22 2012年8月8日 8:58
回答
-
複数行にするのはヘッダだけでいいのですよね?(データ行を複数行に
するのはいろいろ問題があるので、あきらめた方がいいと思います)PreRendar イベントで行を細工すると ViewState との関係が崩れるらし
く、ポストバックで表示が崩れます。なので、GridView.RowCreated イベントのハンドラでヘッダ行を細工する
か、どうしても PreRender で行うなら GridView の ViewState を無効に
したらうまくいくのではないかと思います。#ASP.NET 3.5 以降が使えるなら ListView を使うことをお勧めします。
- 回答としてマーク kaijin22 2012年8月9日 5:16
すべての返信
-
複数行にするのはヘッダだけでいいのですよね?(データ行を複数行に
するのはいろいろ問題があるので、あきらめた方がいいと思います)PreRendar イベントで行を細工すると ViewState との関係が崩れるらし
く、ポストバックで表示が崩れます。なので、GridView.RowCreated イベントのハンドラでヘッダ行を細工する
か、どうしても PreRender で行うなら GridView の ViewState を無効に
したらうまくいくのではないかと思います。#ASP.NET 3.5 以降が使えるなら ListView を使うことをお勧めします。
- 回答としてマーク kaijin22 2012年8月9日 5:16
-
SurferOnWww様
返信遅くなってしまい、申し訳ございません。
PreRenderに拘りはありません。
上記問題が解決され、なるべくスマート?な処理となればそれでよいと考えています。
(スマート:無駄にゴリゴリ組み込まなければといった意味です。)
RowCreatedイベントの細工とはどのように行えば宜しいでしょうか。
また、GridViewのViewStateは初めからfalseになっております。
【余談?】
フレームワークは3.5なので、ListViewも挑戦してみております。
作成はできたようなのですが、何故かページングで以下エラーがでておりますので、それを調査中です。
動作:ページ「1」・「2」の13件が表示され、「2」を2回押さないと画面が再描画されない。
また、「2」を表示した状態で、「1」を押下すると以下のエラーメッセージが表示される。
※他の画面のGridViewのレイアウトと足並みをそろえたいので、なるべくListViewは利用したくありません。
===
ViewState の読み込みに失敗しました。ViewState が読み込まれているコントロールのツリーは、前の要求で ViewState の保存に使用されたコントロールのツリーと一致しなければなりません。たとえば、コントロールを動的に追加する時、ポストバック 中に追加されたコントロールは、最初の要求中に追加されたコントロールの型と位置に一致しなければなりません。
===◆参考にしたサイト
【aspx:ページャー】
・ListViewでページ指定
http://surferonwww.info/BlogEngine/post/2010/11/13/Show-specified-page-of-ListView-programmatically.aspx
※作成したい『一覧表』も、参考サイトのイメージ図とほぼ同様です。
<asp:DataPager runat="server" ID="DataPager" PageSize="10">
<Fields>
<asp:NumericPagerField ButtonCount="10" PreviousPageText="<--" NextPageText="-->" />
</Fields>
</asp:DataPager>
- 編集済み kaijin22 2012年8月9日 4:27
-
追記
以下の通りやれば問題なく処理できました。
SurferOnWww様
の仰る通り、RowCreatedイベントメソッド内にて、ヘッダー追加処理をやれば問題ありませんでした。
無駄に試行錯誤して、正規の手法を後回しにしてしまいました。。。
ひとまず当質問を完了とさせていただきます。
お忙しい中、ご回答ありがとうございました。
===
これを機会にListViewの勉強にもなりました。
参考サイトの通りに動かないのは気になりますが。。。===
・GridViewのHeaderRowについて
http://social.msdn.microsoft.com/forums/ja-JP/vsgeneralja/thread/8e5a93d1-24d2-43e8-8fc6-0f91b56c5845/- 編集済み kaijin22 2012年8月9日 5:20