2009-02-25 6 views
2

が、それは私が他のカスタムコントロール(単にボタン、3枚のラベルやオーバーレイピクチャと各)の束を入れてその中にFlowLayoutPanel、だスーパー遅いC#のカスタムコントロール

それは大丈夫作品約100個のボタンが付いていますが、1000個に達していて困っています。バンプ5000まで、それはちょうど20秒後に死ぬ。

私はカスタムコードがほとんどなく、レイアウトを中断して再開することを賢明に行います。

どうしたのですか?私の(かなり速い)コンピュータは数千のボタンとラベルを扱えるはずです。

(私はC#のGUIのものにかなり新しいですので、おそらく私はとにかく完全に異なることをやってする必要があります。)

編集1:

これはかなり現時点で唯一のカスタムコードです:

flowLayoutPanel1.SuspendLayout(); 
foreach (DataRow row in dt.Rows) // dt is from a DB query 
{ 
    flowLayoutPanel1.Controls.Add(new PersonButton(row)); 
} 
flowLayoutPanel1.ResumeLayout(); 

とPersonButtonコンストラクタで:

this.label1.Text = row["FirstName"].ToString().Trim() + " " 
    + row["Surname"].ToString().Trim(); 

(また、画像は添付のが、私は誰もがそれを見ることができるかどうかはわからないがあるはずです。)

編集2:

私は本当にDataGridViewの、またはリストビューを使用する必要がありますね、私はより多くを望んでいました1行のテキストと1行あたりの小さなアイコン。 firefox(Ctrl + J)のダウンロードビューに似ていると思った。 (スクリーンショットを参照)

あなたのご意見は大変ありがとうございます。私はあなたがレイアウトコードの一部をポストする必要がありますか、我々はすべてで/多くのを助けることができなくなります

alt text http://img156.imageshack.us/img156/1057/capture.png

+0

あなたは、このカスタムコントロールではなく、ユーザーコントロールですか?あなたがユーザーコントロールを作ったようですね。 – recursive

+1

"なんで私は間違っているの?" フォームに1000のボタンを表示します。 –

+0

ページのナビゲーションの概念を使用しよう –

答えて

14

C#WinFormアプリケーションは、どのような種類のコントロールでも1000インスタンスを処理できますか?私はWinForm Guruはありませんが、あなたのアプリケーションから期待していることは不合理かもしれません。

任意のタイプのコントロールを1000個以上表示したいという事実は、間違った方向からソフトウェアの設計に近づいていることを示しているかもしれません。

+0

私はそれが答えになることを心配していた: – aidan

+2

合意!フォームに1000個のコントロールを表示する理由は何ですか? –

+0

+1 Matthew、どのようにユーザーは5000種類のボタンを追跡することができますか? – scottm

2

...私は再考する必要がありますね。

また、あなたの#1のベスト・ベットは、コードをプロファイルすることです。プロファイリングは、コード内で正確に何がゆっくりと実行されているかを調べる唯一の確実な方法です。私の経験上、これは特にUIコードに当てはまります。

+0

コメントにレイアウトコードを載せてください。 flowLayoutPanel1.SuspendLayout(); foreachの(dt.RowsでのDataRow行) {flowLayoutPanel1.Controls.Add(新しいPersonButton(行))。 } flowLayoutPanel1.ResumeLayout(); これは唯一のカスタムコードです。ラベルを変更するPersonButtonコンストラクタを除きます。 – aidan

+0

私は主な質問を更新します。 – JaredPar

1

1000+ボタンでは、おそらくアプリケーションのGDIリソースや未処理ハンドルが危険に晒されている可能性があります。

あなたのアプリケーションが何をすべきかわかりませんが、ここではグリッドまたはコンボボックスが良いオプションかもしれません。

1

あなたのインターフェースを真剣に考え直す必要があるようです。

他の人が触れたように、フォーム上のコントロールの数は使用できません。

しかし、リフレクションを使用していても、コードで新しいコントロールを作成するためにいくつかの実験を行ったところ、フローレイアウトパネルのオンザフライで作成された数百のデータバインドコントロールが1〜2秒。

投稿より多くのコードサンプルは、より良い答えを得るのを助けることがあります。

さらに詳しい情報:私はもう一度私のタイミングテストを再実行してきた、300個のコントロールが0.5秒を要した、400は、1.9秒を要した600が3秒を要し、1000年には6秒を要しました。
リソースが利用され始める300〜400の間には限界があるようです。 5kのコントロールのために必要な

1

レイアウトロジックは、ラッピングパネルのいずれかのタイプのためにあまりにも多くなります。あなたは何千ものエントリを保持するように設計された別のタイプのコントロールを調べたいかもしれません - DataGridViewのようなものです。

DataGridViewのは、あなたが(画像、ボタン、ラベル)を表示しているデータのタイプのために働く必要が利用可能ないくつかの異なるcolumn typesを持っています。データベースクエリはDataTableを返すように見えるので、単にbind that directly to your DataGridViewとループを削除することができます。

0

[ON降霊術のモード=]あなたがデータの1000年の行を持っていますが、あなただけそれらのいくつかを示したので、見ることができます唯一のコントロールを作成し、新しいとその内容を変更して再利用することができますスクロールしたときのデータ

-1

これを試してください。このメソッドをコード内にドロップします。

保護オーバーライドCreateParamsをCreateParamsを {得る {CreateParamsをCP = base.CreateParams。 cp.ExStyle | = 0x02000000; return cp; }}

+0

これがなぜ機能するのか説明してください –

関連する問題