SplitContainerの自動生成コード不具合
※この現象はVisualStudio2005(.NET Framework 2.0),2008(.NET Framework 3.5)で発生、2010(.NET Framework 4.0)で発生しないことを確認しました。
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)なのですが、デザイナが自動生成するソースにて、実際のコントロールサイズを設定する前に各パネルの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;これでとりあえずエラーは発生しなくなりました。
追記:
なお、この不具合はMicrosoftのフィードバックで挙げられていますが、解決策は延期としてクローズされています。
https://connect.microsoft.com/VisualStudio/feedback/details/93991/splitcontainer
VS2010(.NET4.0)では発生しないですが、旧バージョンを使用する際にはご注意ください。