- PR -

コントロールの動的配置について

1
投稿者投稿内容
れしぴ
会議室デビュー日: 2008/01/30
投稿数: 5
投稿日時: 2008-04-03 16:59
この度はお世話になります。

VB2005ExpressEditionにてフォームのパネル内に
コントロールを動的に配置しています。
配置するコントロールを4000個としたところ

ContextSwitchDeadlockが検出されました

というエラーが発生してしまいました。
デバッグ〜例外で上記エラーで中断しないようにしたのですが

Win32Exceptionはハンドルされませんでした

というエラーが発生するようになってしまいました。

コントロールを配列宣言し
dim i as integer
dim y as double
for i=0 to 4000
y=コントロールの高さ*i
me.コントロール(i).location=new system.drawing.point(0,y)
me.panel1.controls.add(コントロール(i))
next

のような単純なコードを記述しているだけです。
配置個数を減らせば、デバッグできるので、コード的には問題ないと思うのですが。

配置数100程度で速度的にも問題なく表示され
1000程度だとデバッグが終わるのにかなりの時間を要しますが、表示され
4000だと上記エラーが発生します。

何かの制限なのでしょうか?

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-04-03 17:32
特に制限という形の制限はないかもしれませんが(私が知らない
だけであるのかもしれません)そもそも4,000個(!)もの
コントロールを置いてどうしようというのでしょう。
私の認識では、100個から多くて300個程度が限度だと思います。
やり方によってはコントロールを置く以外の方法がとれるかも
しれませんので、是非理由を教えていただければ。

コード:

dim i as integer
dim y as double
for i=0 to 4000
    y=コントロールの高さ*i
    me.コントロール(i).location=new system.drawing.point(0,y)
    me.panel1.controls.add(コントロール(i))
next


コントロールは配列にする必要はないですね。
また、コントロールそのものを New している部分が見あたりません
が、どこにあるのでしょう。
回答者側でもテストをしてみるために、できればそのままコンパイル
して動くようなコードを書いておいてもらえると助かります。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
れしぴ
会議室デビュー日: 2008/01/30
投稿数: 5
投稿日時: 2008-04-03 18:11
早々にご返答いただきありがとうございます。

コントロールを配置したい理由ですが
Accessでいう表形式のフォームを作成しています。
複数行を一行表示させたいため、DataGridが使用できません。
複数行のユーザーコントロールを作成し、フォームに配置することにしました。
配置個数はソースのレコードカウントを参照するつもりです。
機能的に表示された値を参照する必要がないと思うので
確かにコントロールを配列にする必要はないかもしれません。

マイクロソフトのHPでサンプルコードを見たのですが
レコードカウントの分だけコントロールを追加しているようでしたので
表形式フォームのすべての機能が必要ないのであれば
Panelに直接addしてもいいかな、的な安易な発想でやってみたのですが・・・。

ですので、コントロールを強引に追加する方法にこだわるわけではないので
何かいいアイディアがあれば早々に乗り換えたいとは思っています。

コードの件
申し訳ありません。
投稿できるパソコンとコードを書いているパソコンが別々なもので・・・。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-04-03 18:26
引用:

れしぴさんの書き込み (2008-04-03 18:11) より:

コントロールを配置したい理由ですが
Accessでいう表形式のフォームを作成しています。
複数行を一行表示させたいため、DataGridが使用できません。
複数行のユーザーコントロールを作成し、フォームに配置することにしました。
配置個数はソースのレコードカウントを参照するつもりです。
機能的に表示された値を参照する必要がないと思うので
確かにコントロールを配列にする必要はないかもしれません。

マイクロソフトのHPでサンプルコードを見たのですが
レコードカウントの分だけコントロールを追加しているようでしたので
表形式フォームのすべての機能が必要ないのであれば
Panelに直接addしてもいいかな、的な安易な発想でやってみたのですが・・・。

ですので、コントロールを強引に追加する方法にこだわるわけではないので
何かいいアイディアがあれば早々に乗り換えたいとは思っています。


理由の説明をどうもありがとうございます。

要するに、例えば8列×2000行といったデータを表示するために
4000個のコントロールを追加しているということですよね。

WindowsForm というか、ウィンドウズのプログラミング一般に
おける話ですが、普通はテキストボックスだとかボタンだとかは
それぞれ独立したウィンドウ(見た目はウィンドウじゃないかも
しれないけど)として扱われます。4000個のコントロールを作成
するということは、言い換えれば画面上に4000個のウィンドウを
表示しているのと同じといえます(詳しくは違いますけど)。
なので、ちょっと多すぎかな、と。

DataGridView などはその点をどうやっているかと言うと、ウィンドウ
は1個で、実際はそれっぽく見えるように書いているだけだったり
します。メモリ上にはデータは持っているとは思いますが、それを
画面上の見えている部分だけ、それっぽく見せている感じです。
そうすることで無駄な消費を抑えています。

自分がやるとしたら、スクロールバーを別個取り付けて、それに
あわせてパネルに自分でゴリゴリ書いてみるか、あるいは見えている
部分だけ(たとえば10行分とか)のコントロールを配置して、その
コントロールの中身を入れ替えることで、あたかもスクロール
しているように見せるとか。
自分で書くか書かないかの違いだけであんまり違いはないですが。

うまく説明できていませんが(笑)そんな感じでやってみるといいかも
しれないです。わからないところがあればまた聞いてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-03 21:32
限りある資源を大切に...
Be carefully about limited RESOURCES.
れしぴ
会議室デビュー日: 2008/01/30
投稿数: 5
投稿日時: 2008-04-04 09:34
ぽぴ王子さん

アドバイスありがとうございます。
Accessフォームからの移植で、サブフォームっていう概念に固執しすぎて
頭が固くなっていたようです。
典型的なデータ閲覧方法にて対応すればよかったわけですね。
.NETなんだからなんとなくもっとスマートにできるんじゃないかと
根拠のない妄想に取り付かれてましたね(汗

このたびはありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)