- PR -

TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-30 18:54
引用:

ふみおさんの書き込み (2007-11-22 14:35) より:
こんにちは。
内容が混乱してるようなので全部読んでいませんが、確かVisibleプロパティがFalseのコントロールはBindしないのは仕様だと思いますが、その辺は確認されていますでしょうか。


オンライン コンシェルジェを利用したのですが、それでも出てきませんでした。

テクニカル サポート使おうかな...
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-12-01 00:24
引用:

Jittaさんの書き込み (2007-11-29 22:47) より:

引用:

ひろれいさんの書き込み (2007-11-29 10:10) より:
誰かが少し言ってましたが、僕はどうして「単価」を非表示にして保持しておく必要があるのかずっと疑問でした。

画面を表示し、金額を算出するまでに時間があった場合、裏で単価が変わってしまっていたらどうすんだろ、と。


これについては、こう書いてあります。
引用:

だんじりさんの書き込み (2007-11-23 11:30) より:
コントロールを隠すことはユーザーにどれほど優しく感じてもらえるかで決めるべきで、めったやたらに表示するものでもないと考えております。今回の場合は単価がそれほど重要でなく結果の金額と、これ以外の数多い金額を集計された合計が重要でした。


私はこれを、「今は隠しておくが、リリース後に表示しなければならなくなるかもしれない」と理解しました。

 Windows 95 から触ってきた人にとって、「コントロールが多くなるとリソースが足りなくなり、Windows が不安定になる」ことは、半ば常識だと思います。そういう開発者は、コントロールを置くことを避けようとするでしょう。
 しかし、Windows 2000 あたりからの人は、そんなことを思わないのかもしれません。当然、「いくらでもコントロールがおける」と思っているでしょう。ちらほらとある、「コントロールを100個置いたら、画面がちらつく」というのは、同じ意識からくる問題だと思います。使用歴の長い人は「そんなに置くのが非常識だ」と指摘しますし、それに対して「非常識だなんて知りませんでした」という返答も、ほぼ同じです。
今日の標語:「限りある資源を大切に」


僕は単純に、Web アプリのセッションのような使い方が出来なくて、しょうがなく TextBox に入れて非表示にしているのかな、と思っていました。

「単金」はシステム的に必要なだけであって、エンドユーザには不要なので、非表示にしたいと。

まあ、今となっては仮定でしかないわけですが。

今日の標語:「家も技術も基礎はシッカリね」
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-01 09:00
引用:

ひろれいさんの書き込み (2007-12-01 00:24) より:
僕は単純に、Web アプリのセッションのような使い方が出来なくて、しょうがなく TextBox に入れて非表示にしているのかな、と思っていました。

「単金」はシステム的に必要なだけであって、エンドユーザには不要なので、非表示にしたいと。

まあ、今となっては仮定でしかないわけですが。

今日の標語:「家も技術も基礎はシッカリね」



あ!DataSetは、アプリケーションじょうにあるんじゃないか!なにも表示させたり待避させたりしなくても、フォーム デザイナで見たときには下の方に置いてあるじゃないか!Webアプリって、書かれて思い出したorz

いや、ラベルで隠すとかしているので、そこに妙な空白が出来ますよね。それって、デザイン的にどうよ?とか思ったので、アクセスするユーザーによって表示/非表示をかえるのかなぁ?とか思ったり。
そういえば、起業を応援する会計ソフトなんだっけ?じゃぁ使う人は一人なのか、って、さっき思い出したり。。。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-12-01 10:08
引用:

Jittaさんの書き込み (2007-11-30 18:54) より:
オンライン コンシェルジェを利用したのですが、それでも出てきませんでした。

テクニカル サポート使おうかな...


私が推測するに、おそらくはBy デザインかと。

たぶんASP.NETのコントロールとの整合性を取るためであろうと推測します。(記憶が確かなら)ASP.NETでコントロールのVisibleをFalseにすると、生成されるHTMLにはそのコントロールは存在しない状態になります。つまり表示しないのではなく物理的に存在しなくなるわけです。

ということはSessionなどに値を保持する仕組みを作らない限り、コントロールに設定した値も保持されないことになります。そのあたりの動作の整合性を取るための仕様なんじゃないかと。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-12-01 17:44
Jittaさん、甕星さん、情報ありがとうございます。

僕のほうでもいろいろ試しているので、情報を載せておきます。

・デザイナでControl()のVisble=Falseのままだとハンドルが作成されない
(Control.HandleCreatedイベントで確認)
・Visible=FalseでもBindingCompleteイベントは発生するが、対象のControlの
IsBindingプロパティはfalseのまま
(ウォッチで確認)
・Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる

まだ全然まとまってないんで恐縮ですがf(^_^;

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-01 20:10
引用:

J.J.さんの書き込み (2007-12-01 17:44) より:
Jittaさん、甕星さん、情報ありがとうございます。

僕のほうでもいろいろ試しているので、情報を載せておきます。

・デザイナでControl()のVisble=Falseのままだとハンドルが作成されない
(Control.HandleCreatedイベントで確認)
・Visible=FalseでもBindingCompleteイベントは発生するが、対象のControlの
IsBindingプロパティはfalseのまま
(ウォッチで確認)
・Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる

まだ全然まとまってないんで恐縮ですがf(^_^;




なるほど。ハンドルが作成されていないのならば、甕星さんの仮説「ASP.NET では Visible=false でコントロールが生成されないこととの整合性を取る」を裏付けますね。

 それでも、納得できないです。理由は、ASP.NET では、いつまでもコントロールが存在しているわけではないからです。サーバへの問い合わせがあるごとに、コントロールは破棄され、再生成されます。しかし、Windows Form では、そのようなことはありません。

 調べ忘れていますが、Form.Load 以降、Application.Idle あたりで Visibile = false にして、その後バインドされているデータを変更すると、どうなるのでしょう。まさかいちいちハンドルを破棄しているとか?
Suspend を発行するするのかなぁ?とか思っていて、Shared Source CLI を見てみようと思って、申請をしたところです。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-12-02 02:12
引用:
・デザイナでControl()のVisble=Falseのままだとハンドルが作成されない
(Control.HandleCreatedイベントで確認)
・Visible=FalseでもBindingCompleteイベントは発生するが、対象のControlの
IsBindingプロパティはfalseのまま
(ウォッチで確認)
・Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる

デザイナでということは、InitializeComponentつまりFormのコンストラクタでVisble=Falseに
した場合はバインドされないということですね。 (実際デザイナでTrueにしておいて、
InitializeComponentの直後でVisble=Falseしてもバインドされません)

Form_LoadでVisible=Falseにした場合は(もちろんFillよりは前でも)バインドされるんですが、
じゃあどのタイミング以降ならFalseにしてもバインドされるのかということになると思います。
バインドするDataSetのInitializedイベントでVisible=Falseにするとバインドされず、
FormのBindingContextChangedイベントでVisible=Falseにするとバインドされることは確認しました。
この間に何がある/起きてるのかは私には(なにやら難しくて;;)わかりかねます。

[追記]
あ、DataSetのInitializedはInitializeComponentの最中に起きちゃうのか。

[ メッセージ編集済み 編集者: べる 編集日時 2007-12-02 02:16 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-12 08:08
引用:

J.J.さんの書き込み (2007-12-01 17:44) より:
僕のほうでもいろいろ試しているので、情報を載せておきます。

・デザイナでControl()のVisble=Falseのままだとハンドルが作成されない
(Control.HandleCreatedイベントで確認)
・Visible=FalseでもBindingCompleteイベントは発生するが、対象のControlの
IsBindingプロパティはfalseのまま
(ウォッチで確認)
・Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる


 テクニカル サポート使いました。J.J.さんが調べて下さったとおりです。仕様は、文書化されていなさそうです。

 個人的には、
「Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる」
これが納得できないですね。true にした時にバインドしているようなのですが、そんな動き方をしたら、「false の間にバインドされている」と勘違いしてしまいます。
 BindingComplete イベントの発生の仕方も、変。まぁ、メッセージ ポンプが動いていない間に、メッセージが関係する(関係するのか?)イベントが発生できるはずはないんだけど。

 タイミングが定かではありませんが、ハンドルが作成された後(実験的には Form.Load イベントから後)なら、Visible プロパティの値に関係なく、バインドされます。何らかの都合で隠しておきたいけど、フォーム上にコントロールを配置したい場合は、Form.Load イベントで Visible プロパティをいじるのが良さそうです。
 ただし、有限かつ、思っているほど多くないリソースを食いつぶさないために、コントロールの配置はできるだけ少なくすることをおすすめします。

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