2 列の TableLayoutPanel を含むユーザー コントロールがあり、別のコントロールで選択された項目の詳細を表示する行を動的に追加するコマンドを受け入れます。したがって、ユーザーは他のコントロール (DataGridView) で行を選択し、DataGridView の SelectedItemChanged イベント ハンドラーで詳細コントロールをクリアしてから、新しく選択した項目のすべての行を再生成します (詳細はまったく異なる場合があります)。前に選択した項目から表示されます)。これはしばらくの間うまく機能します。しかし、選択した項目から別の項目に長時間移動し続けると、更新が非常に遅くなります (それぞれ 3 ~ 5 秒)。それは、すべてを適切に処分していないように聞こえますが、何が欠けているのかわかりません。TableLayoutPanel をクリアするためのコードは次のとおりです。
private readonly List<Control> controls;
public void Clear()
{
detailTable.Visible = false;
detailTable.SuspendLayout();
SuspendLayout();
detailTable.RowStyles.Clear();
detailTable.Controls.Clear();
DisposeAndClearControls();
detailTable.RowCount = 0;
detailTable.ColumnCount = 2;
}
private void DisposeAndClearControls()
{
foreach (Control control in controls)
{
control.Dispose();
}
controls.Clear();
}
そして、次の詳細表示のために必要なすべてのコントロールを TableLayoutPanel にロードし終えたら、次のように呼び出します。
public void Render()
{
detailTable.ResumeLayout(false);
detailTable.PerformLayout();
ResumeLayout(false);
detailTable.Visible = true;
}
私は TableLayoutPanel 内でラベル (および TextBox を使用することはめったにありません) 以外は使用しておらず、ラベルと TextBoxes を作成時にコントロール リスト (DisposeAndClearControls() で参照) に追加しています。detailTable.Controls を反復処理してそのように破棄しようとしましたが、コントロールの半分が欠けているように見えました (デバッガーでステップスルーすることによって決定されます)。このようにして、私はそれらすべてを取得していることを知っています。
描画パフォーマンスを改善するための提案に興味がありますが、特に複数の選択での劣化の原因は何ですか.