トップ回答者
GridViewのButtonFieldの「Text」を、条件分岐で変更できないか。

質問
-
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 = "編集";
}
回答
-
> 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
すべての返信
-
GridViewのRowDataBoundイベントで、データバインドが発生した行毎に処理を記述できます。
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.rowdatabound(VS.90).aspx
#比較部分が==でなく=になっていますよ
-
>かるあ様
アドバイス頂きありがとうございました。
以下のようにする事で、テキスト表示の切り替えが出来ました。------------------------------------------
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="編集" />
こういった事は可能でしょうか? -
> 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
-
> foreachでButtonを生成するとは知りませんでした。
「生成」しているのではなく探しているだけです。
生成は ASP.NET が自動的に行っており、行 (GridViewRow) とその
中のコントロール (Button を含む)が作成されたときに RowCreated
イベントが発生します。なので、RowCreated イベント発生以降は Button が存在するので、
それを探して、そのプロパティ(今回の場合は Text)を設定できる
ということです。コードをコピペするだけでなく、きちんと理解しておくことが、今
後のために重要です。