垂直に積み重ねられたパネルとして使用しようとしている TableLayoutPanel で奇妙な動作が見られます (水平スクロール バーはなく、垂直のみ)。
ここでは、フォームの右側にドッキングされた TableLayoutPanel をセットアップしました。デフォルトで作成される余分な行と列のスタイルを削除しました。列スタイルのサイズ タイプはパーセント (100%) になります。行スタイルのサイズ タイプは AutoSize になります。この問題は、このプロパティが設定されている場合にのみ発生するため、AutoScroll を true に設定し、CellBorderStyle を Single に設定しました。
ボタンに関連するコードは次のとおりです。
private void Button1_Click(System.Object sender, System.EventArgs e)
{
Panel p = new Panel();
p.Dock = DockStyle.Fill;
p.BorderStyle = BorderStyle.FixedSingle;
this.tableLayoutPanel1.Controls.Add(p);
}
private void Button2_Click(System.Object sender, System.EventArgs e)
{
do
{
this.tableLayoutPanel1.PerformLayout();
} while (this.tableLayoutPanel1.HorizontalScroll.Visible);
}
そして、ここに問題を説明する写真があります。
図 1 - Button1 を 1 回クリックし、完全にドッキングされた 1 つのパネルを TableLayoutPanel に追加しました。
図 2 - Button1 をさらに 4 回クリックすると、5 つのパネルが完全にドッキングされ、水平スクロール バーが表示されます。この時点で、表示される垂直スクロール バーがドッキングされたパネルの上に移動せず、水平スクロール バーが表示されない理由がわかりません。
図 3 - Button2 を 1 回クリックすると、そのループが実行され、奇妙なことに、PerformLayout 呼び出しごとにドッキングされたパネルの幅が 1 ずつ減少し、最終的に水平スクロール バーが消えてしまいます。
質問
5 番目のパネルを追加すると、水平スクロール バーが表示されるのはなぜですか? すべてのパネルがドッキングされているため、垂直スクロール バーが表示されたときに、パネルの幅が垂直スクロール バーの幅だけ減少しない理由がわかりません (ドッキングされたパネルが動作するように)。
PeformLayout 呼び出しのたびに幅が 1 ずつ減少する原因となっているレイアウト エンジンで何が起こっているのでしょうか? 私の疑いは、CellBorderStyle プロパティが Single に設定されていることに関連するバグであるということです。
私の 3 番目の、そして実際に私自身にとって最も重要な質問は次のとおりです。行ごとに 1 つのコントロールがあり、そのサイズが親コンテナーの幅に完全に依存する、信頼性の高い垂直に積み重ねられたパネルを取得する最良の方法は何ですか? ソリューションでは、水平スクロール バーが表示されないようにする必要があります。できればすぐに使用できるタイプのソリューション (カスタム コントロールなし) を使用することをお勧めします。