Windowsフォーム・デザイナでコントロールを追加していくと、意図どおりにレイアウト配置できなかったり、意図どおりの順番でコントロールを重ねられなかったりすることがある。
例えば、次の画面例のように、左側にTreeViewコントロール(Docプロパティを「Left」に設定)、真ん中にSplitterコントロール、右側にListViewコントロール(Docプロパティを「Fill」に設定)を追加し、最後にStatusBarコントロールを追加すると、StatusBarコントロールが、フォームの最下部に配置されるのではなく、ListViewコントロールの下に配置されてしまう。
このようなレイアウトになってしまうのは、フォーム上のコントロールの「zオーダー」が正しくないためである。zオーダーとは、フォーム上のコントロールの視覚的な階層構造(=奥行き、z軸)における順番のことだ。これは、コントロールの移動順序を示す「タブ・オーダー」とは異なる(タブ・オーダーについては、「TIPS:Windowsフォームでタブ・オーダーを設定するには?」を参照されたい)。
zオーダーは、フォームのControlsプロパティに(Addメソッドにより)追加されたコントロールの順番に等しい。例えば上の例で示したフォーム・レイアウトならば、次のようなコードにより、フォームに対してコントロールが追加されているはずだ(C#の場合。「this」はフォーム自身を表す)。
this.Controls.Add(this.statusBar1);
this.Controls.Add(this.listView1);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.treeView1);
このコードで最初に追加されたコントロールが最前面にあるコントロールとなり、最後が最背面のコントロールとなる。つまりこのコードでは、最前面にはStatusBarコントロールが配置され、最背面にはTreeViewコントロールが配置されていることになる。
しかし実際には、ステータス・バーはフォーム上の最も基本的なパーツなので、最背面に配置されるべきだ。要するに上記のコードは、次のようなコードに書き換えなければならないわけだ。
this.Controls.Add(this.listView1);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.statusBar1);
ご覧のとおり、このコード修正は、1行を単にカット&ペーストすれば済む程度なので、大した作業ではない。しかし、統合開発環境のVisual Studio .NET(以降、VS.NET)でコーディングを行っている場合には、このコード修正を行うことは難しい。というのも、このコードは、開発者がコード・エディタにより編集することが禁止されているInitializeComponentメソッド内に自動的に追加されるコードだからだ。
従って、このzオーダーの変更は、フォーム・デザイナの機能を使って行う必要がある。
フォーム・デザイナ上でこれを行うには、次の画面例のようにして[レイアウト]ツールバーの[最背面へ移動]ボタンをクリックするか、メニュー・バーから[書式]−[順序]−[最背面へ移動]を選択すればよい。なお逆に、コントロール(のzオーダー)を最前面に移動させるには、「最前面へ移動」を実行すればよい。
ちなみに、このようなコントロールのzオーダーの変更は、コントロールのメソッドを呼び出すことにより実行時にも可能だ。具体的には、次の2つのメソッドを使用する。
なお、本稿で紹介したzオーダーの変更方法では、一気に「最」背面や「最」前面に移動させることしかできない。「1つだけ」背面に移動や「1つだけ」前面に移動のような微調整はできないのだ。このように細かくzオーダーを調整する必要がある場合には、最背面に配置したいコントロールから順番にすべてのコントロールに対して「最前面へ移動」を実行していき、全コントロールのzオーダーを設定し直すとよいだろう。
カテゴリ:Windowsフォーム 処理対象:Windowsフォーム・デザイナ
関連TIPS:Windowsフォームでタブ・オーダーを設定するには?
Copyright© Digital Advantage Corp. All Rights Reserved.