web-dev-qa-db-ja.com

TableLayoutPanelのサイズ設定

必要なものに対して適切なコントロールを使用していない可能性があります。テーブルにコントロールを入力しているので、各列のサイズをその中に含まれるコントロールに自動的に合わせます。たとえば、テキストボックスの列はチェックボックスの列よりも幅が広くなります。さまざまなOS、さまざまなDPI、さまざまなフォントなどの複雑さのために、私がそれを助けることができるかどうかを測定することをいじりたくありません。テーブルはスクロールバーでコントロールに合うように水平に拡張できます。 TableLayoutPanelまたは他のコントロールでこれはどのように可能ですか?

ありがとう。

コードを追加するために編集:

    private void UpdateLocations()
    {
        tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1;
        tableLayoutPanel1.ColumnCount = 7;
        int row = 1;
        int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width;

        Label lab = new Label();
        lab.Text = "Location";
        tableLayoutPanel1.Controls.Add(lab, 0, 0);

        lab = new Label();
        lab.Text = "Arrive";
        tableLayoutPanel1.Controls.Add(lab, 1, 0);

        lab = new Label();
        lab.Text = "Depart";
        tableLayoutPanel1.Controls.Add(lab, 2, 0);

        lab = new Label();
        lab.Text = "Pass?";
        tableLayoutPanel1.Controls.Add(lab, 3, 0);

        lab = new Label();
        lab.Text = "Path";
        tableLayoutPanel1.Controls.Add(lab, 4, 0);

        lab = new Label();
        lab.Text = "Plat";
        tableLayoutPanel1.Controls.Add(lab, 5, 0);

        lab = new Label();
        lab.Text = "Line";
        tableLayoutPanel1.Controls.Add(lab, 6, 0);

        foreach (location loc in CurrentSchedule.location)
        {
            TextBox tb = new TextBox();
            tb.Text = loc.locationID;
            tableLayoutPanel1.Controls.Add(tb, 0, row);

            tb = new TextBox();
            tb.Text = loc.arrivalTime;
            tb.Width = timeWidth;
            tableLayoutPanel1.Controls.Add(tb, 1, row);

            tb = new TextBox();
            tb.Text = loc.departureTime;
            tb.Width = timeWidth;
            tableLayoutPanel1.Controls.Add(tb, 2, row);

            CheckBox cb = new CheckBox();
            cb.Checked = loc.passingTime;
            tableLayoutPanel1.Controls.Add(cb, 3, row);

            tb = new TextBox();
            tb.Text = loc.pathCode;
            tableLayoutPanel1.Controls.Add(tb, 4, row);

            tb = new TextBox();
            tb.Text = loc.platformCode;
            tableLayoutPanel1.Controls.Add(tb, 5, row);

            tb = new TextBox();
            tb.Text = loc.lineCode;
            tableLayoutPanel1.Controls.Add(tb, 6, row);

            row++;
        }
        /*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++)
        {
            tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize;
        }
        for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++)
        {
            tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize;
        }*/
    }

(はい、それは重いリファクタリングが必要です-私はそれを最初に機能させようとしているだけです)

コメントアウトされたビットは、論理的に(私にとっては)そうすべきではありませんが、範囲外の例外を引き起こします。範囲は、実行時ではなく、設計時に設定したものに制限されているように見えます。

11
GeoffM

申し訳ありませんが、列を自動サイズに設定することの何が問題になっていますか?これがTableLayoutPanelの機能であり、列のサイズをその中のコントロールに合わせて調整します。テーブルを展開してスクロールバーを使用するには、テーブルのAutosizeプロパティをtrueに設定してから、スクロールバーが有効になっている別のパネル内にTableLayoutPanelを配置する必要があります。ただし、要件を誤解しない限り、列のサイズ設定はそのままで機能するはずです。

念のため、columnsプロパティに移動し、各列のSizeTypeをAutoSizeに設定しますか?テーブル自体のAutoSizeプロパティだけではありませんか?

enter image description here

これは、あなたの望むことですか?

-郵便番号:

コードをありがとう。これをたくさん行うには、デザイナーを使用することをお勧めします。少なくとも列を設定するには、列を自動サイズに設定し、見出しラベルを追加します。

また、Datagridコントロールをチェックアウトして、それをロケーションリストにバインドすることもできます。

ただし、このメソッドを機能させるには:

1)列が同じサイズに見える理由は、使用している見出しラベルが自動サイズ設定されていないためです。それらはすべてxピクセル幅で、列が伸びています。これを行う:

Label lab = new Label();
lab.AutoSize = true;
lab.Text = "Location";
tableLayoutPanel1.Controls.Add(lab, 0, 0);

また、CheckBoxコントロールおよびコンテンツとして追加するその他のラベルでAutoSizeプロパティをtrueに設定する必要があります。

2)RowCountおよびColumnCountを設定しても、RowStylesまたはColumnStylesコレクションには影響しません。 7つの列がありますが、2つのColumnStylesしかありません。試してみてください:

tableLayoutPanel1.ColumnStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++)
{
   tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
}

tableLayoutPanel1.RowStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.RowCount; i++)
{
   tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
}

注意すべき他の唯一のことは、一部のコントロールが行でずれていることです(たとえば、ラベルが高すぎるように見えます)。これを修正するには、Marginプロパティを通常3,6,3,0に設定して、テキストボックスやチェックボックスなどに揃えます。

15
Justin Doyle

ControlAddedイベントを処理し、新しいコントロールの幅が列の幅よりも大きい場合は、列のサイズを変更する必要があります。

測定をいじりたくないと言いますが、サイズを変更する場合は、そうする必要があります。チェックボックスなどのTextAlignに注意している場合は、フォントなどを入力しないでください。

0
andyhasit

複数の splitContainers 1つを別のパネル内で使用できます。ただし、ネストされたパネルを多く使用しないでください。 this のようなサイズ変更/再描画の問題が発生する可能性があります。

SplitContainer を使用する場合は、多くの例を見つけることができます。

0
CharithJ