none
VS2005でフォームの内容が消える RRS feed

  • 質問

  • いつも参考にさせていただいております。

    VisualStudio2005のC#で作成しています。

    デザイナでFormにコントロールを配置しています。
    先日、突然それらのコントロールが表示されなくなってしまいました。(デザイナで開くとFormのみ表示されている状態です)
    Form.Designar.csを開いてみたところ、コントロール類は生成されプロパティなどの設定もされているのですが、
    FormにAddする↓のコードがすべて消えてしまっていました。
        this.Controls.Add(this.XXX);

    Addを手動で追加したところ元の表示に戻りました。
    しかし、数日後また別のFormで同様の現象が発生してしまいました。

    原因が分からず困っています。
    何かご存じの方がおりましたら、ご教授お願いいたします。

    2009年2月16日 1:02

すべての返信

  • 現時点では、 原因については何とも言えませんが、ユーザコントロールを貼り付けたりしていますか?
    そのほか、問題が起きるフォームは何か特徴的なところがあるのでしょうか?
    また、他のフォーム等でも現象は起きますか?
    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(未解決の場合を除く)。
    2009年2月16日 14:18
    モデレータ
  • #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定義は、おかしくなった様に思います。

    #外していたら、(なにとぞ)スルーして下さい。


    くわぢ
    2009年2月17日 10:20
  • Azulean様

    返信ありがとうございます。
    その後、別のプロジェクトを作成している際にも同じ現象が発生しました。
    もう少し詳しい情報をお知らせします。

    現象が発生したFormで共通しているのは、

    ・SplitContainerをFormにFillでドッキングしている
    ・SplitContainerの左側のPanel1にTreeViewをFillでドッキングしている

    です。

    ちなみに、SplitContainer、Panel1、Panel2のいずれも、上記設定以外はプロパティは変更していません。





    2009年2月19日 0:47
  • m-yyy さん の発言:

    現象が発生したFormで共通しているのは、

    ・SplitContainerをFormにFillでドッキングしている
    ・SplitContainerの左側のPanel1にTreeViewをFillでドッキングしている

    です。

    ちなみに、SplitContainer、Panel1、Panel2のいずれも、上記設定以外はプロパティは変更していません。


    特にユーザコントロールとかは使っていないと言うことですね。

    良いアドバイスや回答ができない状態で申し訳ないですが、今のところ、現象が起きる原因の想像・推測ができないでいます。検索キーワードか何か思い浮かべば探してはみるんですが、今のところはちょっと思い当たりません。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年2月19日 14:42
    モデレータ
  •  こんにちは!(^^)!ふ~です。

    昔で言えば、神隠しで、子供たちが消えてしまったような!?
    実際には各種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

    このように登録順番で、コントロールが消えている可能性はないでしょうか?
    2009年2月21日 7:04
  •  !(^^)!ふ~様

    返信ありがとうございます。

    コントロールの登録順番が入れ替わり、隠れてしまったのではないか・・・とのことですが、
    今回の場合、SplitContainerに登録したコントロールが消えてしまったのではなく、SplitContainer自体が消えてしまっています。
    デザイナが自動で生成するコード(Form.Designar.cs)を確認してみると、FormにFillでドッキングしたはずのSplitContainerがAddされているコード↓が消えてしまっていました。
     this.Controls.Add(this.splitContainer1);

    なので、このコードを追加すると元通りすべてのコントロールが表示されます。
    しかし、このコードが削除されてしまう原因がわかりません。

    ご教授お願いいたします。
    2009年2月24日 0:33
  •  Azulean様

    返信ありがとうございます。

    こちらでもいろいろ調査しているのですが、なかなか原因が分かりません。(その後、発生していませんが・・・)
    今後コントロールが増えた段階で、このような現状が発生するとダメージが大きいです。

    ちょっと質問から逸れてしまいますが、気になったので・・・
    ユーザーコントロールを使用した場合だと、このような現象が発生することがあるのでしょうか?

    何か注意点などありましたら、教えてください。今後の参考にさせていただけたらと思っています。

    2009年2月24日 0:44
  • m-yyy さん の発言:

    ちょっと質問から逸れてしまいますが、気になったので・・・
    ユーザーコントロールを使用した場合だと、このような現象が発生することがあるのでしょうか?

    懸念したのは、ユーザコントロールで書いたコードが、デザイナで実行されていることです。
    ユーザコントロールをデザイナに貼り付けると、デザイナ上でユーザコントロールで書かれているコードが実行されることで、変な動作を起こす可能性もあったので、それを疑っていました。

    しかし、今回の場合は外れそうですね。


    ところで、そのコントロールが消失する現象が出た際は、保存せずにプロジェクトを開き直したりすると、復活するとかありますか?

    私はデザイナで消えたりおかしな動作をした時点で、デザイナをすぐさま閉じています。
    VSSで管理しているので、チェックアウトしていなければ上書き保存されることもなく、また、チェックアウトしていてもチェックアウトを取り消して何事もなかった状態に戻しています。

    トラブルで困っているのであれば、ソース管理を導入してみませんか?
    こまめにチェックアウト・チェックインをしていれば、トラブルが発生してもすぐに戻せますので。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年2月24日 15:00
    モデレータ
  •  Azulean様

    返信ありがとうございます。

    ユーザーコントロールをデザイナで・・・そうなんですか。
    これからユーザーコントロールを使用して開発しようとしていたので、参考になります。

    現象が発生した際にプロジェクトを開きなおすと・・・との質問ですが、
    気がついた時にはすでに保存してしまっていて、確認できませんでした。
    現在はテストプロジェクトですが、今後の本開発ではVSSで管理しようと思います。

    一旦、質問を終了させていただき、また現象が発生した際にもう一度原因を探ってみようと思います。
    長々おつきあいいただきありがとうございました。

    2009年3月2日 4:34