8

これは本当に簡単です。

データベースクエリに基づいたコントロール(ラベル、ボタン、およびボタン付きの一部のパネル)が入力されたTableLayoutPanelがあります。データを更新する必要がある場合は、TableLayoutPanel.Controls.Clear()を使用します。残念ながら、これは非常に遅い操作です。テーブルに入力するコードよりも高速であると思いますが、少なくとも3倍または4倍遅くなります。

メッセージボックスが表示された後にTableLayoutPanelに対して行われる単一の処理としてこれを実行することにより、Controls.Clear()を実行するときの速度が遅いことを明確に証明しました(その後、プロシージャが戻ります)。コントロールは下から上に向かって目に見えて消えます。レコードセットを使用してTableLayoutPanelを再設定すると、上から下に表示されるコントロールの速度は、私が見ることができる速度よりもほぼ速くなります。

私はすでにTableLayoutPanel.SuspendLayout()とResumeLayout()を実行しています。

フォームで使用this.DoubleBuffered = trueしても何も起こらないようです。

コントロール全体を破棄してコードで再作成することもできますが、これは大きな苦痛であり、優れたフォームデザイナーGUIを使用することは無意味です。コントロールに設定したすべてのプロパティを掘り下げて、そのコードの行を作成する必要があります(これは、デザイナーコード自体から取得できると思いますが、それでも間違っていると感じます)。

仕事をより速くする方法について何かアイデアはありますか?TableLayoutPanel以外のメソッドを使用することもできます...セルごとに複数のボタンを配置するか、テーブルヘッダーの列にまたがることができないようにする自由が必要です。

C#は、再描画中にフォーム全体を少なくともフリーズしてから、一度にペイントできますか?

4

4 に答える 4

9

TableLayoutPanels を使用しても速度が遅いという問題が発生しました。フォームに DoubleBuffered プロパティを設定するのではなく、私が見つけた最善の解決策は、TableLayoutPanel から継承する新しいクラスを作成し、そのクラスのコンストラクターでダブル バッファリングを有効にすることです。

public class DoubleBufferedTableLayoutPanel : TableLayoutPanel
{
    public DoubleBufferedTableLayoutPanel()
    {
        DoubleBuffered = true;
    }
}

次に、通常は TableLayoutPanel を使用する場所で、DoubleBufferedTableLayoutPanel を使用します。

于 2010-10-12T19:50:03.093 に答える
0

動的 GUI を作成する場合は、常にコードで作成します。しかし、出発点では、デザイナーがダミーのフォームで開始し、各コントロールを私 (または顧客) が好きなようにスタイルします。その後、Designer.cs ファイルを調べて、そこから必要なプロパティ設定を次のようなファクトリ関数にコピーします。

private TextBox CreateTextBox(string name, /* maybe other parameters */)
{
    var textBox = new TextBox();
    textBox.Name = name;
    //Other settings from given parameters...

    //Further settings which are all the same for these kind of control
    textBox.KeyDown += (sender, e) => {};

    return textBox;
}

そのため、GUI 上ですべてのコントロールが同じように感じられ、同じように見えるようにしています。これは、サーフェス内の各レベルで行われます ( のような小さなコントロールから始まり、やTextBoxのようなコンテナーにまで上がります。GroupBoxTableLayoutPanel

場合によっては、これにより、ファクトリ関数が他のいくつかのファクトリ関数を呼び出すポイントが発生します。これが現実になりつつある場合は、これらのコントロールを 1 つの にカプセル化することを検討する時が来ましたが、これが必要かどうかはUserControlいつものように異なります。

私の側からは、コードをデザイナーから自己記述関数に移動することをお勧めすることしかできません。最初は(いつものように)より多くの作業が必要ですが、後でレイアウトにさらに大きな変更を加える方が簡単です。

于 2010-08-11T07:33:32.480 に答える