none
TabControlの上にComboBoxを載せた場合に起こる不可解な現象 RRS feed

  • 質問

  • 親のフォームから子のフォームを呼んでいます。この時、子のフォームで親をVisible=falseで
    消しています。また、子のフォームをCloseする時、親をVisible=trueで再表示するようにしています。

    子のフォームにはTabControlを配置し、その上にComboBoxを乗せ動かしています。
    DolopDownStyleをDolopDownListで使っていますが、ComboBoxが乗ったTabへマウスクリックで
    移っただけでも、子のフォームを終わると、再表示された親のフォームは子のフォームを呼んだボタン
    だけが表示されていて、表面や他のボタンが白くなってしまい見えなくなってしまいます。
    (マウスで表面をなぞると消えていたボタンは表示されます。)

    他のコントロールでは問題は発生しませんし、
    ComboBoxもDolopDownStyleがSimpleの場合は大丈夫です。

    同じような簡単なプログラムを作っても再現できません。
    (正確にはTabControlの上にTabControlを乗せその上にComboBoxを乗せています。)

    仕方ないので、再度、1から子のフォームを作り直すとしばらくは正常に動いています。
    (ということは、親のフォームにはダメージは無いのだろうと思っています)

    しかし、何かの機会に同じような現象が起きます。
    1度起こりだすと、そのフォームでは新しいTabControlの上に新しいComboBoxを
    乗せただけで、何もコーディングしていなくても、Tabを切り替えると同様になります。

    TabControlとComboBoxを多用してプログラムを作っていますが、
    何時、何が原因で、このようになるのか分からず、仕事が出来ない状態になっています。
    助言、よろしくお願いします。

    2009年12月8日 6:12

回答

  • > Windows Aero の時のみ発生しています。
    > ・・・・・・・・
    > 直接的には、TabPageに貼り付けたComboBoxが引き起こしています。

    Aero かぁ、う~mmm、どうなんだろう・・・(-ω-;

    仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
    もしくはそれが不可なら ComboBox を非表示 (Visible = False) や (Enabled = False) にした場合
    どういう現象が発生するか試してみてはいかがでしょうか?

    もしくは

    > Owner.Visible = true;

    の後に

    Owner.Refresh();

    を実行して、強制再描画をしてみるとどうでしょうか?
    • 回答としてマーク クサキ 2009年12月11日 0:10
    2009年12月9日 5:54
    モデレータ
  • Owner.Refresh(); で問題を解消できまして、とりあえず、仕事が進めていけます。ありがとうございました。

    ただ、何かに問題があるようで下記にまとめておきます。
    (私としては現時点では私のPCのデイスプレイアダプターかと思っています)

    DELL  OptiPlex 755 Windows Vista(R) Business SP1 32ビット
    デイスプレイアダプター ATI(TM) Radeon(R) HD 2400 XT 256MB デュアルモニタ構成対応
    インテル(R) Core(TM)2 Duo プロセッサー E6750 (4MB L2キャッシュ、2.66GHz、1333MHz FSB)
    4GB(1GB*4) デユアルチャンネル DDR2-SDRAMメモリ (800MHz)
    VS2008   Version 9.0.21022.8 RTM   .Net Framework Version 3.5 SP1
    エアロ表示の場合だけ起こる現象。

    まったく新しく、親と子のフォームの簡単なプロジェクトを作っても起きています。
    親と子は同じ大きさ。(または子を大きくする)
    (親)
    ボタンを2つ追加、一方に以下を追加しただけ。
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 fForm2 = new Form2();
                fForm2.Owner = this;
                fForm2.Show();
            }

    (子)
    TabControlを追加、tabPage2にComboBoxを追加、以下のコーディングを追加しただけ。
            private void Form2_Load(object sender, EventArgs e)
            {
                this.Left = Owner.Left;
                this.Top = Owner.Top;
                Owner.Visible = false;
            }

            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                Owner.Visible = true;
            }

    子を表示させ、マウスクリックでtabPage2を表示させ、子フォームを閉じます。
    それだけで、親のフォームの表面と表示させたボタンが白くなってしまいます。

    シングルトンのコーディングも行っていません。
    DolopDownStyleの変更もしていません。(Simpleでは起きないが、デフォルトのDolopDownでも起こるため)
    上の変更を行っただけです。で、私のPCでは現象が出ています。

     

    • 回答としてマーク クサキ 2009年12月11日 0:12
    2009年12月10日 1:06

すべての返信

  • ちょっと情報不足です。

    1.Visual Studio のバージョン
    2.OS
    3.子フォームをどのように起動~終了しているか
    4.ComboBox はデータをバインドしているか

    このあたりの情報は欲しいですね。

    > 正確にはTabControlの上にTabControlを乗せその上にComboBoxを乗せています

    TabControl の上に TabPage ではありませんか?

    2009年12月8日 6:34
    モデレータ
  • > 1.Visual Studio のバージョン
    VS2008です。Version 9.0.21022.8 RTM
    .Net Framework Version 3.5 SP1

    > 2.OS
    Windows Vista Business  Service Pack2

    > 3.子フォームをどのように起動~終了しているか
    (親フォーム)
    定義
    private Abc fAbc = null;

    親の子の呼び出しボタン
    fAbc = Abc.GetInstance();   // 子フォームはシングルトン
    fAbc.Owner = this;
    fAbc.Show();

    (子フォーム)
    親フォームを消す
    private void Abc_Activated(object sender, EventArgs e)
    {
         if (mForm_Loading == 1)        // 1 = Form ローディング中
            {
                    mForm_Loading = 0;      // 0  = Form ローディング終了
                    Owner.Visible = false;
            }
    }
    private void General_FormClosing(object sender, FormClosingEventArgs e)
    {
             Owner.Visible = true;
    }

    // 子フォームのシングルトンのためのコーディング
    private static Abc fAbc = null;
    public static Abc GetInstance()
    {
         if (fAbc == null)
            {
                  fAbc = new Abc();
                 return fAbc;
            }
            else { return fAbc; }
    }
    private Abc()
    {
            InitializeComponent();
    }
    private void Abc_FormClosed(object sender, FormClosedEventArgs e)
    {
            fAbc = null;
    }


    > 4.ComboBox はデータをバインドしているか
    バインドの意味は良く分かりませんが、やっていることはItemsのコレクションで
    項目を2つ入れたことと、DolopDownStyleをDolopDownListにしたことと、
    SelectedIndexChangedイベントを作り、変数に代入したことだけです。
    (タブを切り替えただけでは、SelectedIndexChangedイベントにも入りませんが)


    その他、tabPage は BackColorをControlにしています。
    質問ですが、BackColorがデフォルトのTransparentのままだと、tabPageの背景が白になります。
    デフォルトのTransparentで、フォームの色が表示されると思うのですが、白になります。
    そういうものなのですか?
    それで、BackColorをControlにしてフォームの色と同じにしています。

    > TabControl の上に TabPage ではありませんか?
    TabPageです。

    2009年12月8日 9:22
  • 質問ですが、BackColorがデフォルトのTransparentのままだと、tabPageの背景が白になります。
    デフォルトのTransparentで、フォームの色が表示されると思うのですが、白になります。
    そういうものなのですか?

    そういうものですw
    XP や Vista のビジュアルスタイルとして TabControl は白に設定されるようですね。

    あと、描画の件はまだ判りません。同様な実装でコーディングしてみましたけど再現せず。
    リソース絡みなのかなんなのか・・・
    いずれにせよ ComboBox が原因ではないような気がします。
    2009年12月8日 11:42
    モデレータ
  • XPにもって行きましたが、問題ありませんでした。また、Vistaでも画面の配色を
    Windows Vista ベーシックやWindows スタンダードの場合も問題ありません。
    Windows Aero の時のみ発生しています。

    > いずれにせよ ComboBox が原因ではないような気がします。
    そうなのかもしれませんが、直接的には、TabPageに貼り付けたComboBoxが引き起こしています。




    2009年12月9日 5:17
  • > Windows Aero の時のみ発生しています。
    > ・・・・・・・・
    > 直接的には、TabPageに貼り付けたComboBoxが引き起こしています。

    Aero かぁ、う~mmm、どうなんだろう・・・(-ω-;

    仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
    もしくはそれが不可なら ComboBox を非表示 (Visible = False) や (Enabled = False) にした場合
    どういう現象が発生するか試してみてはいかがでしょうか?

    もしくは

    > Owner.Visible = true;

    の後に

    Owner.Refresh();

    を実行して、強制再描画をしてみるとどうでしょうか?
    • 回答としてマーク クサキ 2009年12月11日 0:10
    2009年12月9日 5:54
    モデレータ
  • > 仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
    ComboBoxを削除しても起こっていました。
    また、DolopDownStyleを変えることで現象の変化があり、ComboBoxが直接的な問題と考えていました。

    現象が確実に出る場合がわかりました。
    this.Left = Owner.Left;
    this.Top = Owner.Top;
    の場合ですと、XとY方向のサイズが共に、子が親より大きい場合か等しい場合に起きます。
    子が親に完全に被さる場合に起こるということのようです。(シングルトンでなくとも起こります。)
    確認して頂けませんか。

    Owner.Refresh(); でも問題を解消できました。
    ただ、OSまたはVSまたは私のパソコンのグラフィックカードのバグかも知れません。
    切り分けておきたいと思いますので上記の確認よろしくお願いします。

     

    2009年12月9日 7:51
  • > 確認して頂けませんか。

    Vista Business でスタイルを Aero にして試してみました。しかし、特に問題は起きません。
    つーか、ComboBox でそう頻繁に発生するなら、既知のバグとして広く知られている筈ですね。

    現象的に

    > OSまたはVSまたは私のパソコンのグラフィックカードのバグかも知れません。

    というより、Aero はある程度グラフィックカードの性能を要求するので
    問題の起きているマシンは、グラフィックカードもしくはそれに関連する描画処理が追いついてないように思えます。
    もしかして古いマシンでオンボードのグラフィックチップとかでしょうか?
    よければ現象が発生しているマシンのグラフィックカードの仕様を教えてもらえませんか?

    もしくはリソースを食いつぶすようなヘビーな処理を、フォームの内部でしてるとか・・・

    > Owner.Refresh(); でも問題を解消できました。

    なら、これで対応するようにした方がいいかも知れません。
    2009年12月9日 8:56
    モデレータ
  • Owner.Refresh(); で問題を解消できまして、とりあえず、仕事が進めていけます。ありがとうございました。

    ただ、何かに問題があるようで下記にまとめておきます。
    (私としては現時点では私のPCのデイスプレイアダプターかと思っています)

    DELL  OptiPlex 755 Windows Vista(R) Business SP1 32ビット
    デイスプレイアダプター ATI(TM) Radeon(R) HD 2400 XT 256MB デュアルモニタ構成対応
    インテル(R) Core(TM)2 Duo プロセッサー E6750 (4MB L2キャッシュ、2.66GHz、1333MHz FSB)
    4GB(1GB*4) デユアルチャンネル DDR2-SDRAMメモリ (800MHz)
    VS2008   Version 9.0.21022.8 RTM   .Net Framework Version 3.5 SP1
    エアロ表示の場合だけ起こる現象。

    まったく新しく、親と子のフォームの簡単なプロジェクトを作っても起きています。
    親と子は同じ大きさ。(または子を大きくする)
    (親)
    ボタンを2つ追加、一方に以下を追加しただけ。
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 fForm2 = new Form2();
                fForm2.Owner = this;
                fForm2.Show();
            }

    (子)
    TabControlを追加、tabPage2にComboBoxを追加、以下のコーディングを追加しただけ。
            private void Form2_Load(object sender, EventArgs e)
            {
                this.Left = Owner.Left;
                this.Top = Owner.Top;
                Owner.Visible = false;
            }

            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                Owner.Visible = true;
            }

    子を表示させ、マウスクリックでtabPage2を表示させ、子フォームを閉じます。
    それだけで、親のフォームの表面と表示させたボタンが白くなってしまいます。

    シングルトンのコーディングも行っていません。
    DolopDownStyleの変更もしていません。(Simpleでは起きないが、デフォルトのDolopDownでも起こるため)
    上の変更を行っただけです。で、私のPCでは現象が出ています。

     

    • 回答としてマーク クサキ 2009年12月11日 0:12
    2009年12月10日 1:06
  • Owner.Refresh(); で問題を解消できまして、とりあえず、仕事が進めていけます。ありがとうございました。

    ただ、何かに問題があるようで下記にまとめておきます。
    (私としては現時点では私のPCのデイスプレイアダプターかと思っています)

    DELL  OptiPlex 755 Windows Vista(R) Business SP1 32ビット
    デイスプレイアダプター ATI(TM) Radeon(R) HD 2400 XT 256MB デュアルモニタ構成対応
    インテル(R) Core(TM)2 Duo プロセッサー E6750 (4MB L2キャッシュ、2.66GHz、1333MHz FSB)
    4GB(1GB*4) デユアルチャンネル DDR2-SDRAMメモリ (800MHz)
    VS2008   Version 9.0.21022.8 RTM   .Net Framework Version 3.5 SP1
    エアロ表示の場合だけ起こる現象。

    環境的には全く問題なさそうです。つーか、こちらの環境より遥かにいい!><

    ちなみに当方の環境

    マシン ・ DELL VOSTRO 200
    CPU ・ Intel Pentium Dual Core E2160 1.80GHz
    メモリ ・ 1.00GB
    グラフィック ・ Intel G33/G31 チップセット(オンボード)
    Windows Vista Business SP2  32ビット
    VS 2008  Version 9.0.30729.1 SP   .Net Framework Version 3.5 SP1
    IE ・ 8.0

    これで全く問題は起きていません。


    再現性が認められるなら、事象を整理した上で、フィードバックに投げてみてもいいかも知れません。
    https://connect.microsoft.com/VisualStudioJapan/



    2009年12月10日 9:09
    モデレータ