- PR -

[ASP.NET]コントロールの種類によってVisibleを変更

投稿者投稿内容
†raimu†
ベテラン
会議室デビュー日: 2005/08/23
投稿数: 61
投稿日時: 2005-10-04 12:31
お世話になります。ライムです。

Visibleプロパティで質問なのですが、
コントロールの種類(TextBoxやLabel)で、まとめてVisibleを
変更するようなことは可能なのでしょうか?
Page.Visibleがあるくらいだから、もしかしたら出来るのかな、と…

良ければ知恵をお貸しください。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-10-04 16:45
javascriptならできるんですけどね(^^;
サーバ側のコードでやる方法はわからないです。

コード:

<script language="javascript">
<!--
function setInvisibileAllTextBox()
{
    for(i = 0; i < Form1.elements.length; i++) {
        elm = Form1.elements[i];
        if(elm.type == "text") elm.style.visibility = "hidden";
    }
}
//-->
</script>

SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-10-04 17:44
ぼのぼのさんがクライアント側は記載してくださいましたので
私は、サーバー側を。あまり良い書き方ではないかも(汗)。。。
コード:
    Dim lctlTest As Control
    Dim lintLoop As Integer
    Dim ltypType As Type
    
    For Each lctlTest In Me.Controls
        If lctlTest.ClientID.Equals("FormのID") Then
            For lintLoop = 0 To (lctlTest.Controls.Count - 1)
                ltypType = lctlTest.Controls(lintLoop).GetType

                Select Case ltypType.Name
                    Case "TextBox"
                        Dim txtText As TextBox
                        txtText = CType(lctlTest.Controls(lintLoop), TextBox)
                        txtText.Visible = False
                End Select
            Next
        End If
    Next


ltypType.Nameのところはデバッグしながら中身を見ると、テキストボックス
以外のものも分かる。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-04 17:55
こんにちは、じゃんぬ です。

引用:

SE卵さんの書き込み (2005-10-04 17:44) より:

Select Case ltypType.Name
  Case "TextBox"


これだと「コンパイル解決」出来ませんので、私は TypeOf 〜 Is が好きです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-04 17:57
では、私がユーザーコントロールを使われた時の奴を^^;

コード:
HideControls( Page.Controls, typeof( TextBox ) );

private void HideControls( ControlCollection controls, Type type )
{
	if( controls.Count == 0 )
	{
		return;
	}

	foreach( Control control in controls )
	{
		if( control is type )
		{
			control.Visible = false;
		}

		HideControls( control.Controls );
	}
}



# 確かめてないんでバグあるかも。
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-10-05 09:09
>
引用:

>じゃんぬねっとさんの書き込み
>これだと「コンパイル解決」出来ませんので、私は TypeOf 〜 Is が好きです。



確かに。。。固有名詞よりTypeOfでの判断の方が良いと思います。
アドバイスありがとうございます。

コード:
If (TypeOf lctlTest.Controls(lintLoop) Is TextBox) Then
    Dim txtText As TextBox
    txtText = CType(lctlTest.Controls(lintLoop), TextBox)
    txtText.Visible = False
End If

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-05 09:26
こんにちは、じゃんぬ です。

引用:

SE卵さんの書き込み (2005-10-05 09:09) より:

確かに。。。(^_^;)固有名詞よりTypeOfでの判断の方が良いと思います。
アドバイスありがとうございます。


生意気に意見しちゃってすいませんでした。(*_ _)

それと、できる限りブロック スコープを使うべきかなぁ... なんて。
For Each, For ステートメント内だけですもんね。
また、某書籍によるとループ変数は厳密名をつけない方が良いらしいです。
これはブロック変数が存在するおかげで簡素化できるんですけどね。

あと、型も決めうちしてますので DirectCast でも問題ないかなぁって思います。
と思ったのですが、System.Web.UI.Control に Visible は実装されているので、
キャスト自体が必要なさそうですね。

コード:

    For Each hControl As Control In Me.Controls
        If hControl.ClientID.Equals("Form の ID") Then
            For Each innerControl As Control In hControl.Controls
                If TypeOf innerControl Is TextBox Then
                    '/ DirectCast(innerControl, TextBox).Visible = False
                    innerControl.Visible = False
                End If
            Next innerControl
        End If
    Next hControl


でも、こんなにネストが深い時点で結構、鬱だったりします。orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-10-05 14:42
メソッドを分けたり、Queue を使ったり、再帰呼び出し使ったり。。。
そういう拡張をしたコントロールを作ったり。
_____________________________________________________________________________
□ Posted by Jitta on 2005/10/05
じったのノート
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________

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