今回は前回の続きです。2.0から追加されたWindowsアプリケーションのコントロール、TableLayoutPanelコントロールについて説明します(最後にFlowLayoutPanelも)。前回紹介した、TableLayoutPanelを使ったサンプル、「TableLayoutPanel1.exe」を今回も使用しています。注意この記事の最新版は「TableLayoutPanelのセルの行または列を拡大する」で公開しています。フォームデザイナによる方法が、MSDNの次のページで説明されています。コントロールの行と列を拡大するこれによると、TableLayoutPanelコントロールのセルの行または列を拡大するには、セルにあるコントロールのRowSpanやColumnSpanプロパティの値を変更するとされています。この方法はフォームデザイナを使った時の方法であり、実際のコントロールのクラスにRowSpanやColumnSpanプロパティは存在しません。実際には、TableLayoutPanel.SetRowSpanとSetColumnSpanメソッドを使って行と列を拡大(あるいは縮小)します。GetRowSpanとGetColumnSpanメソッドにより、コントロールが占有している行と列の数を取得できます。次のコードでは、tableLayoutPanel1に配置されたcurrentControlが占有する列を一つ増やしています。ここでは、現在のtableLayoutPanel1の列の数を超えないようにしていますが、これを超えた数値を設定しても問題ないため、こうする必要はありません。newColSpan);}サンプル「TableLayoutPanel1.exe」では、コントロールを右クリックして表示されるメニューから、列と行を1つ拡大できるようになっています。†TableLayoutPanelもFlowLayoutPanelと同様に、配置された子コントロールのAnchorとDockプロパティに、通常とは少し異なる特別な役割が与えられています。MSDNでは、次のページで説明されています。コントロールで子コントロールを固定およびドッキングするサンプル「TableLayoutPanel1.exe」では、コントロールを右クリックして表示されるメニューから、コントロールのAnchorとDockプロパティを変更することができますので、いろいろと試してみてください。注意この記事の最新版は「TableLayoutPanelの行と列のスタイルを変更する」で公開しています。コントロールの列と行を編集する」で説明されています。コントロールの列と行を編集するフォームデザイナを使った方法では、TableLayoutPanelのRowsやColumnsプロパティを変更しようとすると表示される「列と行のスタイル」ダイアログにより、行と列の挿入や、削除、スタイル(サイズの型)の変更を行うことができます。実際にはTableLayoutPanelクラスにRowsやColumnsプロパティが存在する訳ではなく、実体は、RowStylesプロパティとColumnStylesプロパティです。一行目のサイズの型を絶対サイズの50ピクセルとするには、次のようにします。50F);ただし、RowStylesとColumnStylesはあくまでスタイル(サイズの型)のコレクションであって、行と列そのものを表しているわけではありません。「列と行のスタイル」ダイアログのみで列(あるいは行)を管理している場合は、通常TableLayoutPanelの列の数とスタイルの数は一致します。TableLayoutPanelクラスのRowCountとRowStyles.Count(あるいはColumnCountとColumnStyles.Count)の数値は一致します。フォームデザイナを使ってTableLayoutPanelのRowCountやColumnCountを変更して列や行の数を増やした場合でも、それに応じてRowStylesやColumnStylesにスタイルが追加され、RowCountとRowStyles.Count(あるいはColumnCountとColumnStyles.Count)の数は通常同じになります。注意:デザイナで列や行を増やした時は問題ありませんが、減らしたときは、前のスタイルが削除されずに残り、列や行数とスタイルの数が同じにならないことが多々(というよりほとんど)あります。この場合でもデザイナで見る限りでは分からず、コードを見なければ分かりません。デザイナを使わないで列や行の数を変更した場合は、そうはなりません。RowCountやColumnCountプロパティを変更しても、RowStylesやColumnStylesに自動的にスタイルが追加されることはありません。先に示したように、Controls.Addで子コントロールを追加して行や列が拡張した場合も同じく、スタイルは追加されません。必要に応じて自分で追加しなければならないということになります。その意味で、先ほど示した例も、tableLayoutPanel1.RowStyles[0]が存在するか分かりませんので、正しいやり方とは言えません。ある行のスタイルを変更するコードは、ちょっと面倒ですが、次のようになりそうです。注意この記事の最新版は「TableLayoutPanelの行や列を挿入する」で公開しています。「列と行のスタイル」ダイアログを使えば行や列の挿入は簡単ですが、これを実行時に行ううまい方法はありません。RowStyles.Insertでうまくいかないのは、今まで読んでいただけたのであれば、明白です。結局は、行や列を拡張して、TableLayoutPanelに配置されたコントロールを一つずつ順番に移動されるという地味なやり方になりそうです。単純にそのようなコードを書いたとしてもうまくいくとは限りません。先に述べたように、実行時にTableLayoutPanelに配置されたコントロールはどこに配置されるか予測が付きにくく、新しく挿入した行のセルに入ってきてしまう可能性があるからです(それでいいと言うのであれば、かまわないでしょうが)。よってここでは、先に紹介したように、TableLayoutPanelに配置されたコントロールの位置を実際に現在ある位置に設定してから、列を挿入する処理を行うことにします。以下の例では、insertRowの位置に行を挿入しています。サンプル「TableLayoutPanel1.exe」からの抜粋です。注意この記事の最新版は「TableLayoutPanelの行や列を削除する」で公開しています。これもやはりうまい方法がありませんが、前と同じ方針で行ってみましょう。以下の例では、removeRowの位置の行を削除しています。サンプル「TableLayoutPanel1.exe」からの抜粋です。tableLayoutPanel1.ResumeLayout();このように、実行時にTableLayoutPanelに行や列を挿入あるいは削除するのは簡単ではありません。Frameworkにこのような機能が用意されていないということは、もしかしたら実行時にTableLayoutPanelに行や列を挿入、削除するのは好ましくないということかもしれません。注意この記事の最新版は「TableLayoutPanelのセルを独自に描画する」で公開しています。TableLayoutPanelのCellPaintイベントにより、セルを独自に描画することができます。次の例では、一つおきのセルに色をつけています。サンプル「TableLayoutPanel1.exe」からの抜粋です。注意この記事の最新版は「継承したコントロールでデザイナを使ってFlowLayoutPanelのプロパティを変更できない問題」で公開しています。FlowLayoutPanelを配置したコントロール(フォームを含む)を継承して新たなコントロールを作成した時、継承基に配置されたFlowLayoutPanelオブジェクトのModifiersがPublicであったとしても、継承したコントロールでそのFlowLayoutPanelオブジェクトのプロパティを変更できないという問題があります。これはFlowLayoutPanelだけでなく、TableLayoutPanelやToolStrip、MenuStrip、ContextMenuStrip、StatusStrip、DataGridView、BindingNavigatorコントロールでも起こります。このバグについて詳しくは次のページで説明されています。controlsFlowLayoutPanelについての解決法が次のページで紹介されています。work.これによると、FlowLayoutPanelを継承したクラスを作成し、これにdesignerTypeにPanelDesignerを指定したDesigner属性をつけ、これをFlowLayoutPanelの代わりに継承基のコントロールで使用するということです。}}これをFlowLayoutPanelの代わりに使うようにします。残念ながらこれはFlowLayoutPanelだけの解決法で、TableLayoutPanelをはじめ、他のコントロールには使えません。