質問者
VS2005でフォームの内容が消える

質問
-
いつも参考にさせていただいております。
VisualStudio2005のC#で作成しています。
デザイナでFormにコントロールを配置しています。
先日、突然それらのコントロールが表示されなくなってしまいました。(デザイナで開くとFormのみ表示されている状態です)
Form.Designar.csを開いてみたところ、コントロール類は生成されプロパティなどの設定もされているのですが、
FormにAddする↓のコードがすべて消えてしまっていました。
this.Controls.Add(this.XXX);
Addを手動で追加したところ元の表示に戻りました。
しかし、数日後また別のFormで同様の現象が発生してしまいました。
原因が分からず困っています。
何かご存じの方がおりましたら、ご教授お願いいたします。
すべての返信
-
#VB.NETしか使ったことの無い人間の話なので、ちがう場合は笑って済ませて下さい。
もし、そのFormが他のFormの継承を経ていると仮定した場合の話です。
Formの継承は、文法的には.NETの継承で表現していますが、実際は、
『継承元Formや、継承先Formの他に、「ビルダー or ファクトリー」的なオブジェクト(以下Factory)
が有って、実行直前、Formを組み立てる際に、Factoryが継承元から順にその定義をマクロ的に読み
込んではより継承元の定義をそのまま書き換えていく。その後、実際にNew。』
である様に思えてなりません(ソースは有りません)。それは、Formの定義の文の右辺に、実行時の文脈で
しか使えない関数を指定出来ない事からも、うかがえます。
以上の(外部からの観測に基づく)仮説から導き出されることは、
『Formを継承する場合、(何の継承関係も無い“他人の”)FactoryにForm定義をフルアクセスさせる為、
Formクラスのアクセス制限を(Protected、Internalはもちろん、Protected Internalもだめで)
Publicにしないといけない』
という結果です。たしかProtected InternalのForm定義は、おかしくなった様に思います。
#外していたら、(なにとぞ)スルーして下さい。
くわぢ -
m-yyy さん の発言:
現象が発生したFormで共通しているのは、
・SplitContainerをFormにFillでドッキングしている
・SplitContainerの左側のPanel1にTreeViewをFillでドッキングしている
です。
ちなみに、SplitContainer、Panel1、Panel2のいずれも、上記設定以外はプロパティは変更していません。
特にユーザコントロールとかは使っていないと言うことですね。
良いアドバイスや回答ができない状態で申し訳ないですが、今のところ、現象が起きる原因の想像・推測ができないでいます。検索キーワードか何か思い浮かべば探してはみるんですが、今のところはちょっと思い当たりません。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。 -
こんにちは!(^^)!ふ~です。
昔で言えば、神隠しで、子供たちが消えてしまったような!?
実際には各種Form上のコントロールが見えなくなっているだけではないでしょうか?
私が思うには、コントロールのPanelへのAddの順番が入れ替わり、大きなコントロールの下に隠れてしまったのではと思います。
<状態再現>
・SplitContainerをFormにFillでドッキングしている
・SplitContainerの左側のPanel1にTreeViewをFillでドッキングしている
この状態で、Panel1にボタンコントロール1~4を貼り付ける。
たとえば、
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.button1); // 見えるボタン1
this.splitContainer1.Panel1.Controls.Add(this.button2); // 見えるボタン2
this.splitContainer1.Panel1.Controls.Add(this.treeView1); // <-この前は見え後では見えない。
this.splitContainer1.Panel1.Controls.Add(this.button3); // 隠れたボタン3
this.splitContainer1.Panel1.Controls.Add(this.button4); // 隠れたボタン4
このように登録順番で、コントロールが消えている可能性はないでしょうか? -
!(^^)!ふ~様
返信ありがとうございます。
コントロールの登録順番が入れ替わり、隠れてしまったのではないか・・・とのことですが、
今回の場合、SplitContainerに登録したコントロールが消えてしまったのではなく、SplitContainer自体が消えてしまっています。
デザイナが自動で生成するコード(Form.Designar.cs)を確認してみると、FormにFillでドッキングしたはずのSplitContainerがAddされているコード↓が消えてしまっていました。
this.Controls.Add(this.splitContainer1);
なので、このコードを追加すると元通りすべてのコントロールが表示されます。
しかし、このコードが削除されてしまう原因がわかりません。
ご教授お願いいたします。 -
m-yyy さん の発言:懸念したのは、ユーザコントロールで書いたコードが、デザイナで実行されていることです。
ちょっと質問から逸れてしまいますが、気になったので・・・
ユーザーコントロールを使用した場合だと、このような現象が発生することがあるのでしょうか?
ユーザコントロールをデザイナに貼り付けると、デザイナ上でユーザコントロールで書かれているコードが実行されることで、変な動作を起こす可能性もあったので、それを疑っていました。
しかし、今回の場合は外れそうですね。
ところで、そのコントロールが消失する現象が出た際は、保存せずにプロジェクトを開き直したりすると、復活するとかありますか?
私はデザイナで消えたりおかしな動作をした時点で、デザイナをすぐさま閉じています。
VSSで管理しているので、チェックアウトしていなければ上書き保存されることもなく、また、チェックアウトしていてもチェックアウトを取り消して何事もなかった状態に戻しています。
トラブルで困っているのであれば、ソース管理を導入してみませんか?
こまめにチェックアウト・チェックインをしていれば、トラブルが発生してもすぐに戻せますので。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。