1

TableLayoutPanel を使用すると、厄介なパフォーマンスの問題に直面しています。RadioButton と LinkLabel を使用した単純なユーザー コントロールがあります。LinkLabel のテキストは動的であるため、コントロール全体で AutoSize プロパティが true に設定されています。

これで、AutoScroll が true に設定され、TableLayoutPanel が自動サイズ設定され、内部に 2 列の Panel ができました。この TableLayoutPanel には、上記のユーザー コントロールが設定されています。

private void PopulateLocationItemsTable(Control[] Controls)
{
    //Suspend outher Panel and set AutoScroll to false just in case.
    panelLocationItemsTableCountainer.SuspendLayout();
    panelLocationItemsTableCountainer.AutoScroll = false;
    //Suspend TableLayoutPanel
    tableLocationItems.SuspendLayout();
    Controls = Controls.OrderBy(c => c.Text).ToArray();
    //Populate left column
    int verticalPosition = 3;
    int leftColumnControlsNumber = Controls.Length / 2;
    for (int i = 0; i < leftColumnControlsNumber; i++)
    {
       tableLocationItems.Controls.Add(Controls[i], 0,0);
       Controls[i].Location = new Point(10, verticalPosition);
       verticalPosition += 17;
    }
    //Populate right column
    verticalPosition = 3;
    for (int i = leftColumnControlsNumber; i < Controls.Length; i++)
    {
        tableLocationItems.Controls.Add(Controls[i], 0, 1);
        Controls[i].Location = new Point(10, verticalPosition);
        verticalPosition += 17;
    }
    //Resume TableLayoutPanel
    tableLocationItems.ResumeLayout(true);
    //And restore outher Panel state
    panelLocationItemsTableCountainer.AutoScroll = true;
    panelLocationItemsTableCountainer.ResumeLayout(true);
}

問題は、ユーザー コントロールが最初に FormLoad イベントに取り込まれ、実際に表示される前にフォームが約 10 秒間ハングすることです。これは私にはまったく受け入れられません。

ユーザー コントロールの AutoSize プロパティを false に設定すると、この問題はなくなります。また、ユーザーコントロールを外側のパネルに直接配置しようとしましたが、それも正常に機能します。問題は TableLayoutPanel だけです。誰かがそのような問題に直面し、解決策を見つけましたか? もちろん、正しい座標を計算するパネルに自分のユーザーコントロールを直接配置できますが、TableLayoutPanel を使用することは、そのようなタスクの「正しい」方法です。

4

1 に答える 1

1

TableLayoutPanel を使用するのが正しいアプローチですが、そのコントロールの列を静的な幅と考える必要があります。そのパネルを使用してほぼ同じ問題に直面したアプリケーションがあり、それをすべて間違って見ていたことに気付きました。

2 つの列があり、コンテナー (フォームなど) の幅が 300 ピクセルの場合、各列の幅は 150 ピクセル (パディングなどを除く) であるため、列が反応するのではなく、それらの列内のコントロールが反応する必要があります。

このように見る必要があるもう 1 つの理由は、エンジンが (WPF フレームワークのように) 最初にすべてをメモリ内にレイアウトしないため、変更をすぐにコミットするため、コアで非常に効率的であるためです。

于 2013-04-11T03:48:52.910 に答える