none
GridViewのヘッダーを複数行表示にする方法 + 選択行の取得 RRS feed

  • 質問

  • お世話になっております。
    掲題の件について質問させてください。

    【問題】
    ・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
    2012年8月8日 8:57

回答

  • 複数行にするのはヘッダだけでいいのですよね?(データ行を複数行に
    するのはいろいろ問題があるので、あきらめた方がいいと思います)

    PreRendar イベントで行を細工すると ViewState との関係が崩れるらし
    く、ポストバックで表示が崩れます。

    なので、GridView.RowCreated イベントのハンドラでヘッダ行を細工する
    か、どうしても PreRender で行うなら GridView の ViewState を無効に
    したらうまくいくのではないかと思います。

    #ASP.NET 3.5 以降が使えるなら ListView を使うことをお勧めします。

    • 回答としてマーク kaijin22 2012年8月9日 5:16
    2012年8月8日 14:39

すべての返信

  • 複数行にするのはヘッダだけでいいのですよね?(データ行を複数行に
    するのはいろいろ問題があるので、あきらめた方がいいと思います)

    PreRendar イベントで行を細工すると ViewState との関係が崩れるらし
    く、ポストバックで表示が崩れます。

    なので、GridView.RowCreated イベントのハンドラでヘッダ行を細工する
    か、どうしても PreRender で行うなら GridView の ViewState を無効に
    したらうまくいくのではないかと思います。

    #ASP.NET 3.5 以降が使えるなら ListView を使うことをお勧めします。

    • 回答としてマーク kaijin22 2012年8月9日 5:16
    2012年8月8日 14:39
  • SurferOnWww様

    返信遅くなってしまい、申し訳ございません。

    PreRenderに拘りはありません。
    上記問題が解決され、なるべくスマート?な処理となればそれでよいと考えています。
    (スマート:無駄にゴリゴリ組み込まなければといった意味です。)

    RowCreatedイベントの細工とはどのように行えば宜しいでしょうか。
    また、GridViewのViewStateは初めからfalseになっております。

    【余談?】
    フレームワークは3.5なので、ListViewも挑戦してみております。
    作成はできたようなのですが、何故かページングで以下エラーがでておりますので、それを調査中です。
    動作:ページ「1」・「2」の13件が表示され、「2」を2回押さないと画面が再描画されない。
    また、「2」を表示した状態で、「1」を押下すると以下のエラーメッセージが表示される。

    ※他の画面のGridViewのレイアウトと足並みをそろえたいので、なるべくListViewは利用したくありません。
    ===
    ViewState の読み込みに失敗しました。ViewState が読み込まれているコントロールのツリーは、前の要求で ViewState の保存に使用されたコントロールのツリーと一致しなければなりません。たとえば、コントロールを動的に追加する時、ポストバック 中に追加されたコントロールは、最初の要求中に追加されたコントロールの型と位置に一致しなければなりません。 
    ===

    ◆参考にしたサイト
    ・ListViewでページ指定
    http://surferonwww.info/BlogEngine/post/2010/11/13/Show-specified-page-of-ListView-programmatically.aspx
    ※作成したい『一覧表』も、参考サイトのイメージ図とほぼ同様です。

    【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
    2012年8月9日 4:24
  • 追記

    以下の通りやれば問題なく処理できました。

    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
    2012年8月9日 5:15
  • > 参考サイトの通りに動かないのは気になりますが。。。

    提供されている情報だけでは原因は分かりません。もし、原因解明に興味
    がおありなら、別に新たにスレッドを立てて質問してはいかがでしょう。

    ただし、その際には、もっと詳しい情報を提供してください。

    2012年8月9日 7:57