- - PR -
TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-12 15:26
Jittaさん、テクニカルサポートまで使って頂きありがとうございます。
今日また気になってMSDNを見回してたら、以下の文を見つけました。 これが今回の根源なのかな?って思ってしまいました。(今更ですが) Control.CreateControlメソッド(System.Windows.Forms)より
内部的にどうなってるのかまでは分かりませんが、Controlのコンストラクタが終了した後にCreateControlが呼び出され、そのControlに対してハンドルが作成されているのではないか?と予想します。 そして今回の場合、Form->TextBoxの順でCreateControlが呼び出される為、デザイナでVisibleを操作するとFormのコンストラクタ以前での操作となってしまい、結果TextBoxのハンドルが作成されないのではないかと。 (試しにCreateHandleメソッドを呼び出そうとしましたが、Protectedな為明示的に呼び出すことが出来ませんでした。)
Visible=trueにする事によってCreateControlメソッドが完了するとした場合、Bindにハンドルを使用していると仮定すると、私はなんとなく納得できるような気がします。(少し無理があるかもしれませんが)
これに関しては、Controlのハンドルが作成された後(今回ではTextBox.HandleCreatedイベント後)となりました。でもまあForm.Loadイベントで操作するのが分かりやすいですね。 #なんかここまで書いてて、まだまだ奥までいけるんじゃないか?って気がしてきました。 #(ApplicationContextの場合とか) | ||||||||||||||||
|
投稿日時: 2007-12-12 16:35
直後ではないですね。必要に応じて、です。 通常は、フォームを Show() した時にフォームの実体であるウィンドウが作成(実体化)され、次いでフォーム上に配置された各コントロールが連鎖的に実体化されます。この時、Visible=false な子コントロールの実体化は行われません。 Show() した時以外でも、ハンドル無いとつじつまの合わないような操作を行うと、フォームやコントロールの実体化が行われるようです。 | ||||||||||||||||
|
投稿日時: 2007-12-12 16:55
コンストラクタとCreateHandleをオーバーライドしてブレークをはってデバッグしてみたところ、 確かに、Visible=trueの場合は、Form(TextBoxの親)のCreateHandleが実行される際に、 TextBoxのCreateHandleが呼び出され、Visible=falseの場合は呼び出されていませんでした。 また、外部からCreateHandleを実行するためのpublicメソッドを(TextBoxに)作成し、 インスタンスが作られてからVisible=falseと設定するまでの間によびだした(まあ、 Designer.csいじったわけですが)ところ、確かにバインドされました。 (またはTextBoxのコンストラクタでCreateHandleを呼び出しても確認できます) | ||||||||||||||||
|
投稿日時: 2007-12-12 22:32
いえいえ。コミュニティ内での問題を解決する助けとなるようにいただいているインシデントです。むしろ、使わせてください。
ええ、わからないでもないのですが、 無いものを本当はあったように見せかけるための仕様 のような気がします。。。 開発者の「作った」と一致していないものがある、というのが、なんとも、気持ち悪い... | ||||||||||||||||
|
投稿日時: 2007-12-12 23:07
一応、直後だとは思ってなかったです。 ProgramのMainで
としてて、Application.Run実行手前の時点でブレークをはって、ハンドルが作成されてないことは確認してました。 ただ、Application.Run実行後ににHandleCreatedイベントが発生してたので、そこでいろいろしてくれてるのかなーと思ってましたけど(^^;
.Net Frameworkを触りだして間もない人には、混乱の元になるでしょうね。特にVBerな人たちに。 便利になった代償の不便、てとこでしょうかね... | ||||||||||||||||
|
投稿日時: 2007-12-13 00:25
タスクトレイものを作った時にアイコンの設定で例外になり、
Handle プロパティの説明に「参照すれば強制的に作成される」とあったので次のようなコードになりました。
|