5

TableLayoutPanel を使用して、クライアント領域を 3 行 (1 列のみ) に分割しています。上段と下段は高さを固定するように設計されています。それらにはヘッダーとフッターが含まれ、最初はそれぞれに静的テキストを含む子ラベル コントロールが含まれます (最初から)。中央の行は、残りの領域を埋めるように動的にサイズ変更する必要があります。この中央のペインには、最終的にリストビューが含まれます。管理されているパネル (ExplorerTableLayoutPanel) オブジェクトを引数として取るマネージャー クラスがあります。

public class ExplorerTableLayoutPanelManager
{       
    public ExplorerTableLayoutPanelManager(ExplorerTableLayoutPanel panel)
    {
        LayoutPanel = panel;
    }

テーブル レイアウトの 3 つの行をそれぞれ作成する方法は 3 つあります。

    private void AddHeaderRow()
    {
        const int headerHeight = 30;
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, headerHeight));

        Label label = new Label();
        label.BackColor = Color.AliceBlue;
        label.BorderStyle = BorderStyle.None;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleRight;
        label.Text = "Header Banner";
        label.Dock = DockStyle.Fill;
        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 0;
        LayoutPanel.Controls.Add(label, column, row);
    }


    private void AddBodyRow()
    {
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));

        Label label = new Label();
        label.BorderStyle = BorderStyle.FixedSingle;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleCenter;
        label.Text = "Content Under construction ...";
        label.Dock = DockStyle.Fill;

        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 1;
        LayoutPanel.Controls.Add(label, column, row);
    }


    private void AddFooterRoow()
    {
        const int footerHeight = 30;
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, footerHeight));

        Label label = new Label();
        label.BackColor = Color.AliceBlue;
        label.BorderStyle = BorderStyle.None;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleRight;
        label.Text = "Footer Banner";
        label.Dock = DockStyle.Fill;

        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 2;
        LayoutPanel.Controls.Add(label, column, row);
    }

私が見ている問題は、最後の行が 30 として要求した固定行の高さを占めていることです。この部分は正しいです。ただし、最初の行と 2 番目の行は残りのスペースをそれらの間で均等に分割していますが、これは私が望むものではありません。ご覧のとおり、最後の行とまったく同じ方法で、最初の行の行の高さを明示的に 30 に設定しましたが、これは機能していないようです。2 行目 (中央) の RowStyle サイズは SizeType.AutoSize に設定されていますが、これは残りのスペースを使い切ることを意味していたので、サイズを明示的に設定しないでください。私は間違っているかもしれませんが、よくわかりません。

4

2 に答える 2

11

私はあなたのコードをテストしていませんが、一目で:

private void AddBodyRow()    
{
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    ...

残りのスペースを埋めたいので、SizeType.AutoSizeは必要ありません。そうしないと、ラベルがDockStyle.Fillに設定されていても、本文の行が縮小してラベルに合わせようとします。必要なのは、SizeType.Percentを使用して、行が可能なすべてのスペースを埋めるようにすることです。

private void AddBodyRow()    
{
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f));
    ...
于 2010-04-07T00:22:29.623 に答える
5

デザイナーツールによって追加された既存のスタイルを最初に削除する必要があることがわかるまで、このオブジェクトの正しいサイズ変更動作に長い間苦労していました。

.RowStyles.Clear();

次に、新しいスタイルが機能しています。

.RowStyles.Add(new RowStyle(SizeType.AutoSize));
于 2011-07-15T07:54:35.820 に答える