- PR -

GridViewのコントロールのプロパティ制御について

1
投稿者投稿内容
ちゅぱかぶら
会議室デビュー日: 2007/10/23
投稿数: 4
お住まい・勤務地: 東京
投稿日時: 2007-10-23 17:32
【環境】ASP.NET2.0/VB2005/Webアプリ/WindowsXP(開発機)

はじめまして、ちゅぱかぶらと申します。
社命でWebアプリを作ることになった超初心者です。
ASP.NET2.0(VB2005)で簡単なWebアプリを作っています。

aspxファイルを開く時に、ログインしたユーザのロールによりButtonコントロールのEnabledプロパティをプログラムで制御しようと思っています。

Contentsに配したButtonコントロール(masterページ使用)は下記で制御できました。
  Button1.Enabled = False/True

ところがGridViewのItemTemplateに配したButtonコントロールは制御できませんでした。

[試行1]
  Button2.Enabled = False
[メッセージ]
  'Button2' は宣言されていません。

[試行2]
  Dim btn As Button = CType(GridView1.FindControl("Button2"), Button)
  btn.Enabled = False
[メッセージ]
  オブジェクト参照がオブジェクト インスタンスに設定されていません。

自分ではプログラムからのオブジェクト取得がうまく出来ていないと思っているのですが、Webで調べても八方ふさがりで途方に暮れています。
こうしたらいい、あるいは目指す方向が間違えてるなどお知恵をいただけますと幸いです。
よろしくお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-23 21:58
GridView1は複数の行を持っていてそれぞれの行にButton2があります。なので
GridView1.Rows(0).FindControl("Button2")
のようになります。あとは行が出来るとき(RowCreatedイベント)で制御する方法もあります。
ちゅぱかぶら
会議室デビュー日: 2007/10/23
投稿数: 4
お住まい・勤務地: 東京
投稿日時: 2007-10-24 11:39
べるさま

書き込み場所を間違えた私に、ここでも返答いただきありがとうございます。

「RowCreatedイベントで制御する」というのが私の技術力ではできなかったため、
「それぞれの行にButton2が」という言葉をヒントに以下のコードを書きました。

画面を表示する際に、GridViewは1行ずつ処理しているはず。。。
考えてみれば確かにそうでした。

LoadCompleteでいいのか分かりませんが、望みの動作は達成しました。
べるさんから発想のヒントをいただけたおかげです。どうもありがとうございました!

Protected Sub Page_LoadComplete(ByVal …中略
Dim ir As Integer = GridView1.Rows.Count
Dim btn As Button
For i As Integer = 0 To ir - 1
btn = CType(GridView1.Rows(i).FindControl("Button2"), Button)
If Page.User.IsInRole("(排他したいロール名)") = True Then
btn.Enabled = False
Else
btn.Enabled = True
End If
Next

End Sub
1

スキルアップ/キャリアアップ(JOB@IT)