none
GridViewのButtonFieldの「Text」を、条件分岐で変更できないか。 RRS feed

  • 質問

  • GridViewにButtonFieldを用意したのですが、
    ある条件では「Text」を「編集」。
    ある条件では「Text」を「詳細」。
    としたいです。

    以下、自分なりに試してみた内容なのですが、
    まったくもって出来ませんでした。

    何か対応策あればご教授頂けないでしょうか。
    どうぞ宜しくお願いいたします。


    ------------------------------------

    ①試してみた事。
    ・aspxで「ID="ButtonDetails"」を埋め込む。
    ・aspx.csで「this.ButtonDetails.Text = "詳細";」としてみた。
    ・エラー内容は「型'System.Web.UI.WebControls.ButtonField'には'ID'というパブリックプロパティは含まれていません。」

    ②試してみた事。
    ・aspxで「asp:BoundField」を「asp:Button」とし、「ID="ButtonDetails"」を埋め込む。
    ・aspx.csで「((ButtonField)GridView1.FindControl("ButtonDetails")).Text = "詳細";」としてみた。
    ・エラー内容は「型'System.Web.UI.Control'を型'System.Web.UI.WebControls.ButtonField' に変換できません。」

    ①②共に検討違いなやり方だとは思います。
    どういった対処方法がありますでしょうか。


    ------------------------------------
    ▼aspx
        <asp:GridView ID="GridView1" runat="server"
            AutoGenerateColumns="False"
            DataKeyNames="Id"
            DataSourceID="SqlDataSource1" >
            <AlternatingRowStyle/>
            <Columns>
                <asp:BoundField DataField="CustomerId" HeaderText="ID" />  
                <asp:BoundField DataField="CustomerNameSei" HeaderText="氏名(姓)" />
                <asp:BoundField DataField="CustomerNameMei" HeaderText="氏名(名)" />
                <asp:ButtonField ID="ButtonDetails" ButtonType="Button" CommandName="Details" Text="編集" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="DB接続"
            SelectCommand="SELECT Customer.* FROM Customer
        </asp:SqlDataSource>


    ------------------------------------
    ▼aspx.cs
    //セッション情報から条件分岐がしたい。
    if (Session["ButtonFlg"] = "On")
    {
     this.ButtonDetails.Text = "詳細";
     ((ButtonField)GridView1.FindControl("ButtonDetails")).Text = "詳細";
    }
    else
    {
     this.ButtonDetails.Text = "編集";
    }

    2012年6月26日 8:58

回答

  • > if (Session["ButtonFlg"] == "On")

    これ、キャストを忘れてます。これでうまくいくとは思えませ
    んが?


    > 以下コードのような「Button」をブラウザ表示したいと思っております。
    > <asp:ButtonField ID="ButtonDetails" ButtonType="Button"
    >      CommandName="Details" Text="編集" />

    ButtonType="Button とすれば ButtonField から生成されるのは Button コ
    ントロールなので、GirdView の RowCreated か RowDataBound のイベントの
    ハンドラで Button のあるセルの TableCell.Controls コレクション の中か
    ら、型が Button のコントロールを探して、その Button.Text プロパティを、
    条件に応じて、"編集" or "詳細" に設定してはどうですか。

    Button を探すというのは、以下のような感じです。Cells[0] の 0 は自分の
    ケースにあわせて変えてください。

    foreach (Control control in row.Cells[0].Controls)
    {
        if (control is Button)
        {
            if ("編集" を設定?)
            {
                ((Button)control).Text = "編集";
            }
            else
            {
                ((Button)control).Text = "詳細";
            }
        }
    }
    ただ、ボタンの表示 (Text) だけ変えても、処置は変えられないと思いますが、
    それはどうするのですか? どうも見当はずれなことをしているように思えま
    すが。
    • 回答としてマーク ミルズ 2012年6月26日 15:49
    2012年6月26日 15:03

すべての返信

  • GridViewのRowDataBoundイベントで、データバインドが発生した行毎に処理を記述できます。

    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.rowdatabound(VS.90).aspx

    #比較部分が==でなく=になっていますよ

    2012年6月26日 9:49
  • >かるあ様

    アドバイス頂きありがとうございました。
    以下のようにする事で、テキスト表示の切り替えが出来ました。

    ------------------------------------------
    if (Session["ButtonFlg"] == "On")
    {
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
      e.Row.Cells[7].Text = "編集";
     }
    }
    else
    {
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
      e.Row.Cells[7].Text = "詳細";
     }
    }
    ------------------------------------------

    追加のご質問になってしまうかもしれませんが、
    上記の対応で、ブラウザ上では「編集」というテキストのみが表示されます。

    以下コードのような「Button」をブラウザ表示したいと思っております。
    <asp:ButtonField ID="ButtonDetails" ButtonType="Button" CommandName="Details" Text="編集" />
    こういった事は可能でしょうか?

    2012年6月26日 11:16
  • > if (Session["ButtonFlg"] == "On")

    これ、キャストを忘れてます。これでうまくいくとは思えませ
    んが?


    > 以下コードのような「Button」をブラウザ表示したいと思っております。
    > <asp:ButtonField ID="ButtonDetails" ButtonType="Button"
    >      CommandName="Details" Text="編集" />

    ButtonType="Button とすれば ButtonField から生成されるのは Button コ
    ントロールなので、GirdView の RowCreated か RowDataBound のイベントの
    ハンドラで Button のあるセルの TableCell.Controls コレクション の中か
    ら、型が Button のコントロールを探して、その Button.Text プロパティを、
    条件に応じて、"編集" or "詳細" に設定してはどうですか。

    Button を探すというのは、以下のような感じです。Cells[0] の 0 は自分の
    ケースにあわせて変えてください。

    foreach (Control control in row.Cells[0].Controls)
    {
        if (control is Button)
        {
            if ("編集" を設定?)
            {
                ((Button)control).Text = "編集";
            }
            else
            {
                ((Button)control).Text = "詳細";
            }
        }
    }
    ただ、ボタンの表示 (Text) だけ変えても、処置は変えられないと思いますが、
    それはどうするのですか? どうも見当はずれなことをしているように思えま
    すが。
    • 回答としてマーク ミルズ 2012年6月26日 15:49
    2012年6月26日 15:03
  • >かるあ様
    >SurferOnWww様

    ご指摘頂いた内容でスバリ解決できました。
    foreachでButtonを生成するとは知りませんでした。

    「編集」と「詳細」でテキストは変わるけど、

    イベント内容は変わらないの、こちらで大丈夫でした。

    大変ありがとうございました。


    • 編集済み ミルズ 2012年6月26日 15:50
    2012年6月26日 15:48
  • > foreachでButtonを生成するとは知りませんでした。

    「生成」しているのではなく探しているだけです。

    生成は ASP.NET が自動的に行っており、行 (GridViewRow) とその
    中のコントロール (Button を含む)が作成されたときに RowCreated
    イベントが発生します。

    なので、RowCreated イベント発生以降は Button が存在するので、
    それを探して、そのプロパティ(今回の場合は Text)を設定できる
    ということです。

    コードをコピペするだけでなく、きちんと理解しておくことが、今
    後のために重要です。

    2012年6月27日 13:11