DOBON.NET DOBON.NETプログラミング掲示板過去ログ

自作のコントロールが重くて仕方ない

分類:[.NET]

ちょくちょく書き込みさせていただいてます.
(質問ばかりで申し訳ないです)

今,自作のテーブルコントロール(エクセルの表みたいなもの)を作っています.
行,列のヘッダーには,(VB.NETで標準で用意されている)ボタンコントロールを,
セルには,テキストボックスコントロールを使用しています.
表のサイズは,3000行×10列くらいを想定しています.
ということで,テキストボックス30000個(ボタンコントロールは3000個あまり)を
生成しなければいけないのですが,起動時に重くてしかたありません.
最初,プログラムの中で30000回ループさせてテキストボックスを生成していました.
重いのはこれのせいかなと思って,デザイン時に30000個生成させることにしました.
(ここの過去ログを参照させていただきました.)
するとデザイン時に非常に重たくなってしまいました.
しかし,まあこれは予想の範疇で,実行時に軽くなってくれればいいかなと思ってたの
ですが,全然満足のいくレベルになってくれません.
今,1000行×5列くらいでテストしてますが,CPUが1G,メモリが500MのPCで
起動に1分以上かかります.
最終的にはこのくらいのサイズの表を10枚以上使用した入力ジェネレータを
つくらなければならないので,この程度のサイズで,こんな遅さだと使えません.

数がこれくらいになると,これくらいの時間がかかってしまうのでしょうか?
解決策,もしくは別の方法(標準のコントロールを使わない方法など)を
知っている方がいらしたら,教えてください.

よろしくお願いいたします.
■No2018に返信(TYさんの記事)
> ちょくちょく書き込みさせていただいてます.
> (質問ばかりで申し訳ないです)
>
> 今,自作のテーブルコントロール(エクセルの表みたいなもの)を作っています.
> 行,列のヘッダーには,(VB.NETで標準で用意されている)ボタンコントロールを,
> セルには,テキストボックスコントロールを使用しています.
> 表のサイズは,3000行×10列くらいを想定しています.
> ということで,テキストボックス30000個(ボタンコントロールは3000個あまり)を
> 生成しなければいけないのですが,起動時に重くてしかたありません.
> 最初,プログラムの中で30000回ループさせてテキストボックスを生成していました.
> 重いのはこれのせいかなと思って,デザイン時に30000個生成させることにしました.
> (ここの過去ログを参照させていただきました.)
> するとデザイン時に非常に重たくなってしまいました.
> しかし,まあこれは予想の範疇で,実行時に軽くなってくれればいいかなと思ってたの
> ですが,全然満足のいくレベルになってくれません.
> 今,1000行×5列くらいでテストしてますが,CPUが1G,メモリが500MのPCで
> 起動に1分以上かかります.
> 最終的にはこのくらいのサイズの表を10枚以上使用した入力ジェネレータを
> つくらなければならないので,この程度のサイズで,こんな遅さだと使えません.
>
> 数がこれくらいになると,これくらいの時間がかかってしまうのでしょうか?
> 解決策,もしくは別の方法(標準のコントロールを使わない方法など)を
> 知っている方がいらしたら,教えてください.
>
> よろしくお願いいたします.
>

30000行全てを同時に表示するのでないのならば、表示される部分のみ(20行なら20行のみ)作成・表示し、
非連動のスクロールバーのValue値に応じてセルの内容を随時変更するというのはどうでしょうか?

全てのセルの内容がメモリに保持されるので、それでもそれなりに重いかもしれませんが…。
2004/01/06(Tue) 01:17:03 編集(投稿者)

> 行,列のヘッダーには,(VB.NETで標準で用意されている)ボタンコントロールを,
> セルには,テキストボックスコントロールを使用しています.
> 表のサイズは,3000行×10列くらいを想定しています.
> ということで,テキストボックス30000個(ボタンコントロールは3000個あまり)を
> 生成しなければいけないのですが,起動時に重くてしかたありません.

インスタンスの生成はかなり重い部類の処理なので、
コントロールを大量に生成すれば、否応なしに極度に重くなります。
また、Windowsのリソースを大量に消費しますのでOSさえも不安定にしかねません。
まずはインスタンスの生成を減らすことが重要かと思います。

> 最初,プログラムの中で30000回ループさせてテキストボックスを生成していました.
> 重いのはこれのせいかなと思って,デザイン時に30000個生成させることにしました.

デザイン時に生成する、ということは単にデザイナでデザインするための便宜上のもの
でしかありませんので、すべてのコントロールは実行時に生成されます。
#デザイン時にコントロールを配置した場合は、デザイナを開くたびに
#毎度、それらのコントロールのインスタンスを生成し、VS.NET上に表示しているだけです。

> (ここの過去ログを参照させていただきました.)
> するとデザイン時に非常に重たくなってしまいました.

そのため、デザイン時に重たいわけですが、

> しかし,まあこれは予想の範疇で,実行時に軽くなってくれればいいかなと思ってたの
> ですが,全然満足のいくレベルになってくれません.

実行時に生成されないわけではないので、実行スピードには何の影響もありません。

> 数がこれくらいになると,これくらいの時間がかかってしまうのでしょうか?
> 解決策,もしくは別の方法(標準のコントロールを使わない方法など)を
> 知っている方がいらしたら,教えてください.

もっとも手っ取り早いのは、標準でも使用できるDataGridコントロールを使うか、
市販の表コントロールを購入して使うことでしょう。

表コントロール等を開発している人間ではないですが、
自作するのであれば、表はすべて自前で描画し(見えている部分だけ)、
表に関連するすべての情報を自前のデータ構造で管理する必要があると思います。

#.NETじゃないですが、表系コントロールは以前作ろうと試みたことがあります。
#表の列幅の変更一つとっても処理速度を殺さずに実装するのが、
#私には難しかったので断念しましたけど。
#そのときは、入力時だけ入力箇所の位置にTextBoxを表示させて、
#そこで入力させるといった手を使ってました。
琴さん,よねKENさん,ありがとうございます.

よねKENさんのレス,大変勉強になりました.

> もっとも手っ取り早いのは、標準でも使用できるDataGridコントロールを使うか、
> 市販の表コントロールを購入して使うことでしょう。

DataGridを最初使おうと思ってたのですが,(ここでもいくつか質問させて
いただいたのですが)どうもやりたい処理,表現ができそうにないので
(もしくは,困難そうなので)あきらめました.
市販のは,予算等の関係で…(VB6時は文化オリエントのSpreadを使ってました)

とりあえず,琴さんの方法で考えてみます.
(やりたい処理ができるかどうか,ちょっと心配なのですが)

一応解決済みにしておきますが,参考になるようなことがございましたら
教えてください.ありがとうございました.
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板