
現在、Controls.Addで明細行を30行程生成しています。
Formを開こうとしてから2秒程止まった後、開かれます。
実際は100行生成したいのですが、これ以上Form表示処理に時間がかかるとユーザー的にも使いにくいものになってしまいます。
現在のコード
For i = 1 to 30
Create()
Next
Private Sub Create
Dim Label As New Label
(ステータス指定処理)
Controls.Add(Label)
....
End Sub
軽くする方法、または別の方法をご教授頂ければ嬉しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
もう質問者が退会していますが・・・
スピードアップのテクニックとして、1行分のレイアウトが同一なら、行ごとユーザーコントロールにするとControls.addする際の処理時間がバラバラで処理するより短くなりますよ。
ここからは完全に余談なんですが、コンストラクタでControls.addする時間とLoadイベント内でaddする時間を比較すると、確かにコンストラクタで実行したほうが何倍も速いです。
しかし、実際にフォームをNew→showする時間を比較すると、コンストラクタ版は体感できるほど早くありません。コンストラクタ版のほうがほんのちょっと早いくらい。
Windows フォームのイベントの順序というドキュメントがMicrosoftのサイトにありまして、ここに書かれているイベントにそれぞれStopWatchを仕掛けて計測してみると、Loadイベント版は当然Loadに最も時間がかかっていますが、コンストラクタ版はLoad版のLoadと同じくらいの時間がBindingContextChangedでかかっていました。
なので、Formの初期化で真に時間がかかる処理はBindingContextの初期設定なんじゃないかと考えます。
なお、本当にFormのロード処理でユーザーを待たせたくなかったら、あらかじめhidden状態でフォームを初期化しておいて、実際にユーザーが開いた際にvisible=trueするのが体感もっとも早いと思います。そういう話はナシですか…?
投稿2018/08/08 14:49
総合スコア4447
0
作成するコントロールを配列にしてControls.AddRangeにて追加すれば
多少は改善するかと思います。
下記コードにて検証しましたところ
Controls.Add・・・・・約1500ms
Controls.AddRange・・・約550ms
となりました。
ただ、テストコードでラベルを1000個生成していますが、遅くて1500msとなっています。
他の部分で遅くなっている可能性もありますので、どこが遅いか検証してください。
VB.NET
1 Private labels(999) As Label 2 3 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 4 5 Dim sw As New Stopwatch 6 Me.AutoScroll = True 7 8 sw.Start() 9 For i = 0 To 999 10 Create(i) 11 Next 12 sw.Stop() 13 Trace.WriteLine(sw.ElapsedMilliseconds) 14 15 16 sw.Restart() 17 For i = 0 To 999 18 Create2(i) 19 Next 20 Controls.AddRange(labels) 21 sw.Stop() 22 Trace.WriteLine(sw.ElapsedMilliseconds) 23 End Sub 24 25 Private Sub Create(index As Integer) 26 27 Dim Label As New Label 28 29 Label.Text = String.Format("ラベル{0:000}", index) 30 Label.Top = 30 * (index \ 10) 31 Label.Left = 100 * (index Mod 10) 32 Label.Visible = True 33 34 Controls.Add(Label) 35 End Sub 36 37 Private Sub Create2(index As Integer) 38 39 Dim Label As New Label 40 41 Label.Text = String.Format("ラベル{0:000}", index) 42 Label.Top = 30 * (index \ 10) 43 Label.Left = 100 * (index Mod 10) 44 Label.Visible = True 45 46 labels(index) = Label 47 End Sub 48
追記
コメントから読み取れたように、1行30コントロール(Labelを15個、TextBoxを15個)とし、100行を
コントロール1つづつAddしたところ、約2200msとなりました。
これを、1行分をUserControlとして作成し、UserControlを100個生成するようにしたところ、約1100msとなりました。
また、SuspendLayout、ResumeLayoutを使用すると、多少速くなる可能性があるかと思います。
投稿2018/08/08 01:44
編集2018/08/08 04:35総合スコア10542
0
ラベルを 100 個作るということは、表示しきれないのでスクロール領域の計算が繰り返されている可能性があります。
Control.SuspendLayout メソッド () を使うと改善するかもしれません。
また、ラベルではなく DataGridView や ListView などの使用を検討してください。
投稿2018/08/08 04:29
総合スコア28673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
フォームデザイナでLabelを100個並べておけばいいんじゃ?
それだと時間はかからないでしょ
投稿2018/08/08 03:05
総合スコア88163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/08/08 03:07
2018/08/08 03:17

退会済みユーザー
2018/08/08 03:55
2018/08/08 04:06
2018/08/08 05:02

退会済みユーザー
2018/08/08 06:32
2018/08/08 06:46

退会済みユーザー
2018/08/08 07:00

退会済みユーザー
2018/08/08 07:07

退会済みユーザー
2018/08/08 07:09
2018/08/08 07:12

退会済みユーザー
2018/08/08 07:12
2018/08/08 07:13
2018/08/08 07:22
2018/08/08 07:26
2018/08/08 07:43

退会済みユーザー
2018/08/08 07:56

退会済みユーザー
2018/08/08 07:57

退会済みユーザー
2018/08/08 08:15
2018/08/08 08:16
2018/08/08 09:25 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。