web-dev-qa-db-ja.com

TableLayoutPanelのセルを表示および非表示にします

私のテーブルレイアウトパネルには、1つの列と3つの行があります。 (1つは各セルの[塗りつぶし]パネルにドッキングされています。)

ここで、行を非表示/表示できるようにしたいと思います。 (いくつかのラジオボタンのユーザー選択に基づいて)いつでも1つの行だけを表示したいのですが、TableLayoutPanelのすべての領域を埋めるようにサイズを変更したいと思います。

どうやってやるの?何かご意見は?

16
Bohn

では、なぜTableLayoutPanelを使用したのですか?

フォームに3つのPanelを入力し、各行の内容を全員に入力して、3つのパネルすべてのDockプロパティをFillに設定するだけです。 2つのパネルを設定しますVisible = falseと1からtrue

別のパネルを表示したい場合は、そのパネルを表示して、他の2つを非表示にします(ラジオボタンの設定に基づいて)。

5
Oliver

TableLayoutPanelの行のサイズが自動化されている場合、コンテンツパネルを非表示にすると、パネルが配置されているセルも非表示になります。

20
arbiter

他の行の高さを0に設定するのが最も簡単な方法です。

1行目:

this.tableLayoutPanel1.RowStyles[1].Height = 0;
16
Martin Tapp

これを試して

TableLayoutPanel1.ColumnStyles[1].SizeType = SizeType.Absolute;
TableLayoutPanel1.ColumnStyles[1].Width = 0;
9
champu

私のシナリオも同様です。チェックボックスの選択に応じてそれぞれが表示される必要がある4行のTableLayoutPanelが必要でした。したがって、一度に1行だけを表示する代わりに、1〜4を表示できます。1列と4行でレイアウトを設計した後、コントロールが追加され、Dockがそれぞれの塗りつぶしに設定されました。次に、チェックボックスの単一のCheckedChangedイベントハンドラーで、次のようにコーディングしました。それは一種の強引な方法ですが、ねえ...それはうまくいきます!

    private void checkBox_CheckedChanged(object sender, EventArgs e)
    {
        this.SuspendLayout();
        int seldCount = checkBox1.Checked ? 1 : 0;
        seldCount += checkBox2.Checked ? 1 : 0;
        seldCount += checkBox3.Checked ? 1 : 0;
        seldCount += checkBox4.Checked ? 1 : 0;

        float pcnt = 0;
        if (seldCount == 1)
            pcnt = 1;
        if (seldCount == 2)
            pcnt = 0.5f;
        if (seldCount == 3)
            pcnt = 0.33f;
        if (seldCount == 4)
            pcnt = 0.25f;

        int newHeight = (int)(tableLayoutPanel1.Height * pcnt);

        if (checkBox1.Checked)
        {
            tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[0].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[0].Height = 0;
        }

        if (checkBox2.Checked)
        {
            tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[1].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[1].Height = 0;
        }

        if (checkBox3.Checked)
        {
            tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[2].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[2].Height = 0;
        }

        if (checkBox4.Checked)
        {
            tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[3].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[3].Height = 0;
        }
        this.ResumeLayout();
    }
6
Jeff Reichard

行を非表示にするには、これを試してください!

tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;
4
Haseeb Ahmed

私には同様のタスクがあり、私の解決策は次のとおりです。

TableLayoutPanelをフォーム(または任意のコンテナー)に追加します。

TableLayoutPanelの列と行の数を1に設定し、サイズを100%に設定します。

DockをFillに設定します。

GrowStyleをfixedSizeに設定します。

AutoSizeをtrueに設定します。

次に、3つのフォーム/コントロールすべてをプログラムで追加します。そのうちの1つは、ラジオボタンの選択に応じて表示する必要があります。それらの1つだけが表示されていることを確認してください。これは、最初のFirstControl.Show()で実行できます。次に、各RadioButtonイベントで、現在のイベントを非表示にし、別のイベントを表示します。ローカル変数で「覚えている」ことができます(たとえば、「currentlyVisibleControl」は現在表示されている参照です)

注:一度に複数の.Show()を実行する場合。次に、TableLayoutPanelは、いっぱいでこれ以上アイテムを追加できないという例外を発生させます。

P.S.私自身の例では、MDIウィンドウにTableLayoutPanelがあり、ボタンのクリックで相互に置換する3つのフォームがあるため、ソースコードをコピーすると「口頭」の例が複雑になると思います。

P.P.S.私の経験から、VisualStudioはデザインモードで奇妙なことをすることがあります。プロパティを正しく設定し、デザイナーと実行時の両方で結果を取得するには、TableLayoutPanelを削除して再度追加する必要がありました。したがって、自動サイズ設定値または絶対値/パーセント値のいずれかがデザイナー画面に表示されない場合は、デザイナーの問題ではなく、デザイナーの問題である可能性があります。削除して再試行してください。

3
Revaz

HeightプロパティとSizeTypeプロパティをいじってみましたが、奇妙な結果が得られました。たとえば、ターゲット行のラベルは非表示でしたが、TextBoxは非表示でした。

これは、行の子コントロールを非表示にするという@arbiterの提案を使用して思いついた拡張クラスです。

// these methods only works on rows that are set to AutoSize
public static class TableLayoutPanelExtensions
{

    public static void HideRows(this TableLayoutPanel panel, params int[] rowNumbers)
    {
        foreach (Control c in panel.Controls)
        {
            if (rowNumbers.Contains(panel.GetRow(c)))
                c.Visible = false;
        }
    }

    public static void ShowRows(this TableLayoutPanel panel, params int[] rowNumbers)
    {
        foreach (Control c in panel.Controls)
        {
            if (rowNumbers.Contains(panel.GetRow(c)))
                c.Visible = true;
        }

    }

}
0
Walter Stabosz