2009-06-08 28 views
3

私はコントロールと有効フラグをとる基本フォーム上に再帰的メソッドを持っています。フォーム上のすべてのコントロールを通過し、コントロールの種類に応じてコントロールの背景色を設定し、enabledプロパティをパラメータに設定します。コントロールの有効化/無効化を高速化する(C#WinForms)

一般に、このメソッドはコントロールとして渡すと呼ばれ、すべてのコントロールとコントロールを通過し、それに応じて設定されます。これはうまくいっていますが、フォームにはコントロールが追加されていますが、実際にコントロールが1つずつ無効になっているように見えます。

私はこれを書き直すか、コントロールごとに無効にするプロセスを1つずつ表示するのをやめることができますか?この場合に動作するSuspendLayoutのような何か?これは、フォームにパネルを追加し、それを無効にして最後に再び有効にするオプションではありません。この基本フォームから継承し、それぞれを通過してコントロールにパネル。これはまた、コントロールの有効化/無効化の問題だけでなく、他のロジックの適用も原因となるため、機能しません。

+1

このフォームのコントロールの数は、おおよそのものですか? – curtisk

+0

*ではありません。おそらく約20/30。 – Madeleine

+0

コードを投稿できますか? –

答えて

7

に修正を囲み:コントロール階層は時間がかかるかもしれない横断、また

form.SuspendLayout(); 

form.ResumeLayout(false); // read the doc about "false", might be a little unsafe 

。あなたはそれを一度行うことができ、それらをリストにキャッシュし、その後にそのリストを参照することができます。

+0

SuspendLayoutは有効/無効には機能しません。それは塗料とレイアウトのためにのみ動作します... – Madeleine

+3

私はわかりません。あなたは正しいかもしれませんが、とにかく、あなたは質問で言った: "コントロールを有効/無効にするだけでなく、他のロジックを適用することの問題です。"たった20/30のコントロールを扱っているのであれば、あなたの問題はコントロールツリーでそれらを検索することだと思います。一度配列にキャッシュして、代わりにキャッシュリストを使用できませんでしたか? –

+1

画面の読み込みを試してリストに追加し、リストのレイアウトロジックを実行してみてください。ありがとう – Madeleine

-3

OnPaintメソッドをオーバーライドし、無効にした場合はsuper :: OnPaintのみを呼び出します(IsDoneDisabling = true)。それは単なる良い設計ではない回避策です。

OnPaint(...) 
{ 
if (IsDoneDisabling) 
    super::OnPaint(...); 
} 
+1

質問はC#、.NETとタグ付けされています。私はシンタックスがC#で有効かどうか疑問に思っています...無関係な絵画のコンセプトはもちろんですが。 –

+0

これは単純な擬似コードです。また、私は絵画の無関係についてあなたのポイントを得ることはありません。 –

関連する問題