- PR -

見えていないコントロールのVisibleを知りたい

1
投稿者投稿内容
だーやん
会議室デビュー日: 2004/03/07
投稿数: 16
投稿日時: 2006-10-18 21:16
環境:VS2003 & C# & WindowsForm

タブページに配置したコントロールは、親コンポーネントのタブページが選択されていないとき、常にVisible=falseです。(見えていないから当たり前といえばそうなんですが・・・)
しかし、タブページが選択されていない時に同じVisible=falseのコントロールでも、タブページが選択されるとVisible=trueとなり見えるようになるコントロールとVisible=falseのまま見えないコントロールがあるわけで、その判別をしたいと思っています。


親コンポーネントのVisibleを引き継がない、コントロール本来のVisibleをあらわすプロパティーがないかとメンバ一覧を眺めていましたが、それらしいプロパティーが見つかりませんでした。
どのようにすれば取得できるのでしょうか?

ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-10-18 23:13
設定した状態の Visible を返すプロパティなりメソッドを見つけられませんでした。

各コントロールごとに VisibleChanged を設定してそこで全てのコントロールのVisible 状態を覚えておくような手間のかかる処理しか考えられません。

そもそもなぜこのような判別が必要になったのでしょうか。
それがわかればこのような判別がいらなくなるような別解があるかもしれません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-19 09:10
引用:

ダッチさんの書き込み (2006-10-18 23:13) より:

そもそもなぜこのような判別が必要になったのでしょうか。
それがわかればこのような判別がいらなくなるような別解があるかもしれません。


同感です。

何かの判別に必要だとして、Visible プロパティを使う必要性がありません。
それこそ、Tag プロパティやフラグなどで判別した方が、まだ意味が通じます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-10-19 09:21
逆に、これを行いたい場面というものに興味はありますね。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
だーやん
会議室デビュー日: 2004/03/07
投稿数: 16
投稿日時: 2006-10-19 10:07
レスありがとうございます。
取得はやっぱり無理なのですね。

なぜそのようなコントロールのVisibleが知りたいかなのですが、
下記動作をする既存アプリが存在するためです。
1、Form起動時に各種設定ファイルを読み込みこんで、各コントロールの表示非表示を決定
2、動作時にコンボボックスやチェックボックスの選択状況により、起動時の各コントロールの表示非表示を変更
3、見えているコントロールの内容だけ保存

今までは、コントロールが画面内に配置しきれたので問題はなかったのですが、今回修正で項目が増えたためコントロールをタブ上に分けて配置するという決定が下されました。1と3はすべての画面で共通に使われているため、あまり深く手を入れたくありません。

そもそもVisibleを使うのはおかしいという意見は、ごもっともなのですが今回の修正のためになるべく工数をかけたくなかったので、コントロール本来のVisibleを取得できないかと思った次第です。
#ちなみにTagは別の用途に使われていました。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-10-19 10:23
引用:

だーやんさんの書き込み (2006-10-19 10:07) より:
1と3はすべての画面で共通に使われているため、あまり深く手を入れたくありません。

#ちなみにTagは別の用途に使われていました。


オhる。。。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-10-19 11:37
再現コード(VS2005)
タブ2つ、タブ1にButton1、タブ2にTextBox1とButton2
コード:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
        With TextBox1
            .Visible = Not .Visible
        End With
    End Sub

End Class



タブ2、つまりTextBox1が見えてるときにVisible=Falseにすると、タブを変更しても引き継がれる。
その他はだめみたい。。。

考えてみれば、入力項目により他のタブの項目の表示を切り替えるっていう場面はありえますね。

で、仕様ですと書いてある(--;
http://support.microsoft.com/kb/834616/ja
やはり自分で記憶しておくしかないね。
Tagがだめなら、(非)表示項目Collectionというのが一番簡単かも。
だーやん
会議室デビュー日: 2004/03/07
投稿数: 16
投稿日時: 2006-10-19 12:36
まどかさんのリンクしてくださったページがきっかけで解決しました。

タブページのShow()メソッドを呼び出すと見えていないコントロールの本来のVisibleを取得することが出来るようです。
Visibleを取得する前にすべてのタブページのShow()を呼ぶことにしました。

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

あと、いろいろ試していたときに気づいたのですが、
親タブページ表示、子コントロール表示の状態から
タブで違うページを選択→子コントロールのVisibleにfalseを代入→再び親タブページを選択
の場合、コントロールが表示から非表示に変わるにもかかわらずVisibleChangedが走らないのですがこれも仕様でしょうか?なにかご存知であれば教えてください。
1

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