トップ回答者
TabControlの上にComboBoxを載せた場合に起こる不可解な現象

質問
-
親のフォームから子のフォームを呼んでいます。この時、子のフォームで親をVisible=falseで
消しています。また、子のフォームをCloseする時、親をVisible=trueで再表示するようにしています。
子のフォームにはTabControlを配置し、その上にComboBoxを乗せ動かしています。
DolopDownStyleをDolopDownListで使っていますが、ComboBoxが乗ったTabへマウスクリックで
移っただけでも、子のフォームを終わると、再表示された親のフォームは子のフォームを呼んだボタン
だけが表示されていて、表面や他のボタンが白くなってしまい見えなくなってしまいます。
(マウスで表面をなぞると消えていたボタンは表示されます。)
他のコントロールでは問題は発生しませんし、
ComboBoxもDolopDownStyleがSimpleの場合は大丈夫です。
同じような簡単なプログラムを作っても再現できません。
(正確にはTabControlの上にTabControlを乗せその上にComboBoxを乗せています。)
仕方ないので、再度、1から子のフォームを作り直すとしばらくは正常に動いています。
(ということは、親のフォームにはダメージは無いのだろうと思っています)
しかし、何かの機会に同じような現象が起きます。
1度起こりだすと、そのフォームでは新しいTabControlの上に新しいComboBoxを
乗せただけで、何もコーディングしていなくても、Tabを切り替えると同様になります。
TabControlとComboBoxを多用してプログラムを作っていますが、
何時、何が原因で、このようになるのか分からず、仕事が出来ない状態になっています。
助言、よろしくお願いします。
回答
-
> Windows Aero の時のみ発生しています。
> ・・・・・・・・
> 直接的には、TabPageに貼り付けたComboBoxが引き起こしています。
Aero かぁ、う~mmm、どうなんだろう・・・(-ω-;
仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
もしくはそれが不可なら ComboBox を非表示 (Visible = False) や (Enabled = False) にした場合
どういう現象が発生するか試してみてはいかがでしょうか?
もしくは
> Owner.Visible = true;
の後に
Owner.Refresh();
を実行して、強制再描画をしてみるとどうでしょうか?- 回答としてマーク クサキ 2009年12月11日 0:10
-
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
すべての返信
-
> 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です。 -
-
> Windows Aero の時のみ発生しています。
> ・・・・・・・・
> 直接的には、TabPageに貼り付けたComboBoxが引き起こしています。
Aero かぁ、う~mmm、どうなんだろう・・・(-ω-;
仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
もしくはそれが不可なら ComboBox を非表示 (Visible = False) や (Enabled = False) にした場合
どういう現象が発生するか試してみてはいかがでしょうか?
もしくは
> Owner.Visible = true;
の後に
Owner.Refresh();
を実行して、強制再描画をしてみるとどうでしょうか?- 回答としてマーク クサキ 2009年12月11日 0:10
-
> 仮に問題が起きている TabPage から、暫定的に ComboBox を削除してテストしてみる。
ComboBoxを削除しても起こっていました。
また、DolopDownStyleを変えることで現象の変化があり、ComboBoxが直接的な問題と考えていました。
現象が確実に出る場合がわかりました。
this.Left = Owner.Left;
this.Top = Owner.Top;
の場合ですと、XとY方向のサイズが共に、子が親より大きい場合か等しい場合に起きます。
子が親に完全に被さる場合に起こるということのようです。(シングルトンでなくとも起こります。)
確認して頂けませんか。
Owner.Refresh(); でも問題を解消できました。
ただ、OSまたはVSまたは私のパソコンのグラフィックカードのバグかも知れません。
切り分けておきたいと思いますので上記の確認よろしくお願いします。 -
> 確認して頂けませんか。
Vista Business でスタイルを Aero にして試してみました。しかし、特に問題は起きません。
つーか、ComboBox でそう頻繁に発生するなら、既知のバグとして広く知られている筈ですね。
現象的に
> OSまたはVSまたは私のパソコンのグラフィックカードのバグかも知れません。
というより、Aero はある程度グラフィックカードの性能を要求するので
問題の起きているマシンは、グラフィックカードもしくはそれに関連する描画処理が追いついてないように思えます。
もしかして古いマシンでオンボードのグラフィックチップとかでしょうか?
よければ現象が発生しているマシンのグラフィックカードの仕様を教えてもらえませんか?
もしくはリソースを食いつぶすようなヘビーな処理を、フォームの内部でしてるとか・・・
> Owner.Refresh(); でも問題を解消できました。
なら、これで対応するようにした方がいいかも知れません。 -
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
-
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/