ハテナキハテナ --unics’s think/sync

福井のまんなかでぼんにょり呟く、ゆにくすの日々オボエガキなど。

VisualStudio2005にて、SplitContainerのバグ…。

※会社のメーリングリストに流したので言葉遣いが変わってたりします(^^;
SplitContainer(パネルの中身を2分割して境界線を自由に移動できるやつです)でデザイナの不具合を発見したので、その回避方法を記述しておきます。
SplitContainerには以下のプロパティが存在します。

「Panel1MinSize」
  ――パネル1の最小幅(縦分割の場合は最低高)
「Panel2MinSize」
  ――パネル2の最小幅(縦分割の場合は最低高)
「SplitterDistance」
  ――2つのパネルの分割位置。Panel1MinSizeとPanel2MinSizeの間の値である必要がある。

しかし、各パネルのMinSize値をデフォルトから変更すると、SplitterDistanceの値がPanel1MinSizeとPanel2MinSizeの間の値であるにも関わらずデザイナでエラーが発生します。
この件についてネットで調べたところ、以下のURLに記述がありました。
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-36298.htm
SplitContainer自体の初期設定サイズは(150,150)なのですが、デザイナが自動生成するソースにて、実際にSizeを設定する前に各パネルのMinSizeを設定してしまい、その値が初期設定サイズを超えてしまうことで発生するようです。
とりあえず手っ取り早くエラーを発生させなくする方法として以下の処置をとりましたので、SplitContainerをお使いになる際の参考になればと思います。
(ここからデザイナをいじって再ビルドするとまた発生するので、根本的な解決にはなってないのですが…)

該当するフォームのDesigner.csを見ると、以下のような記述になっています。

//
// splitContainer
//

//いろいろ設定

//
// splitContainer.Panel1
//
this.splitContainer.Panel1.Controls.Add(this.label1);
this.splitContainer.Panel1MinSize = 300;
//
// splitContainer.Panel2
//
this.splitContainer.Panel2.Controls.Add(this.label2);
this.splitContainer.Panel2MinSize = 500;
this.splitContainer.Size = new System.Drawing.Size(816, 504);
this.splitContainer.SplitterDistance = 350;
this.splitContainer.TabIndex = 24;

この、「Panel2の設定の後に親パネルのサイズ設定が行われている」というのが原因のようです。
ということで、上記ソースの下3行を移動しました。

//
// splitContainer
//

//いろいろ設定

this.splitContainer.Size = new System.Drawing.Size(816, 504);
this.splitContainer.SplitterDistance = 350;
this.splitContainer.TabIndex = 24;

//
// splitContainer.Panel1
//
this.splitContainer.Panel1.Controls.Add(this.label1);
this.splitContainer.Panel1MinSize = 300;
//
// splitContainer.Panel2
//
this.splitContainer.Panel2.Controls.Add(this.label2);
this.splitContainer.Panel2MinSize = 500;

これでとりあえずエラーは発生しなくなりました。

VS2008ではどうなんでしょうかねぇ…時間があったら確かめてみようかな。
追記:
VS2008でも発生しました。→http://d.hatena.ne.jp/unics/20080513/p1

qqq for your reading!!
(c)Electro-U-nics --since 2004.03.26