- - PR -
TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-30 18:54
オンライン コンシェルジェを利用したのですが、それでも出てきませんでした。 テクニカル サポート使おうかな... | ||||||||||||
|
投稿日時: 2007-12-01 00:24
僕は単純に、Web アプリのセッションのような使い方が出来なくて、しょうがなく TextBox に入れて非表示にしているのかな、と思っていました。 「単金」はシステム的に必要なだけであって、エンドユーザには不要なので、非表示にしたいと。 まあ、今となっては仮定でしかないわけですが。 今日の標語:「家も技術も基礎はシッカリね」 | ||||||||||||
|
投稿日時: 2007-12-01 09:00
あ!DataSetは、アプリケーションじょうにあるんじゃないか!なにも表示させたり待避させたりしなくても、フォーム デザイナで見たときには下の方に置いてあるじゃないか!Webアプリって、書かれて思い出したorz いや、ラベルで隠すとかしているので、そこに妙な空白が出来ますよね。それって、デザイン的にどうよ?とか思ったので、アクセスするユーザーによって表示/非表示をかえるのかなぁ?とか思ったり。 そういえば、起業を応援する会計ソフトなんだっけ?じゃぁ使う人は一人なのか、って、さっき思い出したり。。。 | ||||||||||||
|
投稿日時: 2007-12-01 10:08
私が推測するに、おそらくはBy デザインかと。 たぶんASP.NETのコントロールとの整合性を取るためであろうと推測します。(記憶が確かなら)ASP.NETでコントロールのVisibleをFalseにすると、生成されるHTMLにはそのコントロールは存在しない状態になります。つまり表示しないのではなく物理的に存在しなくなるわけです。 ということはSessionなどに値を保持する仕組みを作らない限り、コントロールに設定した値も保持されないことになります。そのあたりの動作の整合性を取るための仕様なんじゃないかと。 | ||||||||||||
|
投稿日時: 2007-12-01 17:44
Jittaさん、甕星さん、情報ありがとうございます。
僕のほうでもいろいろ試しているので、情報を載せておきます。 ・デザイナでControl()のVisble=Falseのままだとハンドルが作成されない (Control.HandleCreatedイベントで確認) ・Visible=FalseでもBindingCompleteイベントは発生するが、対象のControlの IsBindingプロパティはfalseのまま (ウォッチで確認) ・Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる まだ全然まとまってないんで恐縮ですがf(^_^; | ||||||||||||
|
投稿日時: 2007-12-01 20:10
なるほど。ハンドルが作成されていないのならば、甕星さんの仮説「ASP.NET では Visible=false でコントロールが生成されないこととの整合性を取る」を裏付けますね。 それでも、納得できないです。理由は、ASP.NET では、いつまでもコントロールが存在しているわけではないからです。サーバへの問い合わせがあるごとに、コントロールは破棄され、再生成されます。しかし、Windows Form では、そのようなことはありません。 調べ忘れていますが、Form.Load 以降、Application.Idle あたりで Visibile = false にして、その後バインドされているデータを変更すると、どうなるのでしょう。まさかいちいちハンドルを破棄しているとか? Suspend を発行するするのかなぁ?とか思っていて、Shared Source CLI を見てみようと思って、申請をしたところです。 | ||||||||||||
|
投稿日時: 2007-12-02 02:12
した場合はバインドされないということですね。 (実際デザイナで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 ] | ||||||||||||
|
投稿日時: 2007-12-12 08:08
テクニカル サポート使いました。J.J.さんが調べて下さったとおりです。仕様は、文書化されていなさそうです。 個人的には、 「Form_Load後にVisible=Trueにするとハンドルが作成されBindも有効となる」 これが納得できないですね。true にした時にバインドしているようなのですが、そんな動き方をしたら、「false の間にバインドされている」と勘違いしてしまいます。 BindingComplete イベントの発生の仕方も、変。まぁ、メッセージ ポンプが動いていない間に、メッセージが関係する(関係するのか?)イベントが発生できるはずはないんだけど。 タイミングが定かではありませんが、ハンドルが作成された後(実験的には Form.Load イベントから後)なら、Visible プロパティの値に関係なく、バインドされます。何らかの都合で隠しておきたいけど、フォーム上にコントロールを配置したい場合は、Form.Load イベントで Visible プロパティをいじるのが良さそうです。 ただし、有限かつ、思っているほど多くないリソースを食いつぶさないために、コントロールの配置はできるだけ少なくすることをおすすめします。 |