- PR -

【ASP.NET】Page上のサーバコントロール一覧...

1
投稿者投稿内容
haruka
常連さん
会議室デビュー日: 2003/12/09
投稿数: 36
投稿日時: 2003-12-19 13:53
遥@初心者 修行中です。いつも参考にさせて頂いています。
現在、Webアプリを製造開発しています。
 またまた壁にぶち当たりました。(T_T)
過去ログをあたってみましたが、どうもわかりません。
ご指南頂けませんでしょうか?


参照のみの場合、編集の場合とで、テキスト等のサーバコントロール
の属性(ReadOnly、BorderStyle、BackColorプロパティ)を変えたいと
思っています。
各ページで同様な処理を行うので、この処理を共通化し、クラス化
したいと思います。

参照のみの場合で、そのページのサーバコントロールがテキスト
だったらReadOnly=Trueに、それ以外のコントロールだったら何も
処理しないということがやりたいのですが、具体的に
そのページのサーバコントロールをどのように引数として渡して
やればよいかわかりません。

参考程度になる情報でも結構ですので、宜しくお願いします。
FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-12-19 14:09
こんにちは

こんなやり方はいかがでしょうか。
共通メソッドにWebページのインスタンスを渡す
メソッドの中ではControlsを再帰的に走査しテキストボックスだったら
コントロールのプロパティを変更する

以下のような感じ
呼び出すときはページを引数に渡す
#最近はVB.NET場借家っていますのでVB.NETです。
コード:

Public Sub sample(ByVal target As Control)
If target.HasControls() Then
Dim child As Control
For Each child In target.Controls()
If TypeOf child Is TextBox Then
Dim text As TextBox = child
text.ReadOnly = True
End If
Next
End If
End Sub



#失礼かぶったっぽい


[ メッセージ編集済み 編集者: FOX 編集日時 2003-12-19 14:11 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2003-12-19 14:09
単純に取得したいだけであれば、下記のようなメソッドを書いて、Parentにページオブジェクトをtypeに取得したいコントロールの型を渡すと、戻り値に取得したいコントロールの配列が入るので、それに対して処理してあげるといいと思います。
コード:

Public Shared Function GetControls(ByVal Parent As Control, ByVal type As System.Type) As Object()
Dim objControl As Control
Dim tmpControl As Control
Dim objList As New Collections.Stack()
Dim objControls() As Object

'検索
For Each objControl In Parent.Controls
'現在の要素が指定の型であれば、スタックに登録
If objControl.GetType().Name = type.Name Then
objList.Push(objControl)
End If
'現在の要素が子を持っていたら再帰呼び出し
If objControl.Controls.Count > 0 Then
objControls = GetControls(objControl, type)
'再帰呼び出しした結果コントロールリストを持っていればスタックに登録
If Not objControls Is Nothing Then
For Each tmpControl In objControls
objList.Push(tmpControl)
Next
objControls = Nothing
End If
End If
Next
'返す
objControls = objList.ToArray()
Return objControls
End Function




#同じくかぶってました。失礼。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2003-12-19 14:17 ]
haruka
常連さん
会議室デビュー日: 2003/12/09
投稿数: 36
投稿日時: 2003-12-19 15:04
遥です。うん、どうもうまくいきません。(TT)
Pageインスタンスを渡すとは、

 Dim obCommon as New ClassA  ※CalssA;クラス名
 obCommon.共通メソッド名(Page)

じゃ、だめなんでしょうか?
恥ずかしいのはやまやまですがご教授ください。



NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2003-12-19 15:20
該当ページの中で処理するのであれば、
objCommon.共通メソッド名(Me(自分自身))
でいいですね。

該当ページの外で処理するのであれば(あるのか?)、
objCommon.共通メソッド名(該当ページクラスのインスタンス)
となります。
haruka
常連さん
会議室デビュー日: 2003/12/09
投稿数: 36
投稿日時: 2003-12-19 16:04
だめでした。なぜに〜。
処理ははしるのですが、For Each child In target.Controls()
のループが3回しかまわりません。
ページに含まれるサーバコントロールは50個はあるのですが。。。
なんでだろう


■呼ぶ側■
Pageクラス、Page_Loadの中に記述。
 Dim obCommon as New ClassA
 obCommon.sample(me)


■共通クラス■
Public Class A
  Public Sub sample(ByVal target As Control)
    If target.HasControls() Then
      Dim child As Control
      For Each child In target.Controls()
        If TypeOf child Is TextBox Then
          Dim text As TextBox = child
          text.ReadOnly = True
        End If
      Next
    End If
  End Sub
End Class


[ メッセージ編集済み 編集者: haruka 編集日時 2003-12-19 16:10 ]
FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-12-19 16:47
こんにちは

すいません私の例が間違っています。
再帰といいながら再起では有りませんでした。

修正版は以下のとおり
コード:
    Public Sub sample(ByVal target As Control)
       If target.HasControls() Then
            Dim child As Control
            For Each child In target.Controls()
                If TypeOf child Is TextBox Then
                    Dim text As TextBox = child
                    text.ReadOnly = True
                End If
                sample(child) ' <--- ここが抜けていた
            Next
        End If
    End Sub



皆さんご迷惑をおかけしました。m(_o_)m
haruka
常連さん
会議室デビュー日: 2003/12/09
投稿数: 36
投稿日時: 2003-12-19 17:23
遥です。

ついにやりました。できました。綺麗な?コーディングができました。
Page_Loadのところで、ばかばかばかばか書こうかと思ってましたので。

PageクラスのControlsコレクション内を走査して、くるくるまわすよう
にしました。

NAL-6295さん、FOXさんつきあってくれてありがとうございます。
はやく人にアドバイスできるようにならねば〜。

1

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