- タニ
- 会議室デビュー日: 2006/11/06
- 投稿数: 3
|
投稿日時: 2006-11-06 11:20
はじめての書き込み失礼します。
DataGridViewに50列のデータを表示し、その後40列のデータを非表示にする為に
必要な項目を表示にする()
For Each dgc As DataGridViewColumn In Me.DataGridView1.Columns
If Not (dgc.DisplayIndex = 1 Or dgc.DisplayIndex = 2 Or dgc.DisplayIndex = 3 Or dgc.DisplayIndex = 4 _
Or dgc.DisplayIndex = 5 Or dgc.DisplayIndex = 6 Or dgc.DisplayIndex = 7 Or dgc.DisplayIndex = 8 _
Or dgc.DisplayIndex = 9 Or dgc.DisplayIndex = 10 Or dgc.DisplayIndex = 0) Then
dgc.Visible = False
End If
Next
この様な形でVisibleの設定をしているのですが、データ量が多いとかなりの時間(400件のデータを表示するのに1分弱)掛かってしまいます。
ある程度現状の状態を保ったままもう少し表示速度を早めたいと思っているのですが何か良い方法は無いでしょうか。
大変申し訳ありませんが、ご教授願えればと思います
|
- かるあ
- ぬし
- 会議室デビュー日: 2003/11/16
- 投稿数: 1190
- お住まい・勤務地: センガワ→ムサシノ
|
投稿日時: 2006-11-06 11:34
引用: |
|
タニさんの書き込み (2006-11-06 11:20) より:
DataGridViewに50列のデータを表示し、その後40列のデータを非表示にする為に
|
まず、何のために50列のうち40列を非表示にしたいのでしょうか?
_________________ かるあ のメモ と スニペット
|
- platini
- 大ベテラン
- 会議室デビュー日: 2002/12/03
- 投稿数: 193
|
投稿日時: 2006-11-06 12:19
引用: |
|
dgc.DisplayIndex = 1 Or dgc.DisplayIndex = 2 Or dgc.DisplayIndex = 3 Or dgc.DisplayIndex = 4 _
Or dgc.DisplayIndex = 5 Or dgc.DisplayIndex = 6 Or dgc.DisplayIndex = 7 Or dgc.DisplayIndex = 8 _
Or dgc.DisplayIndex = 9 Or dgc.DisplayIndex = 10 Or dgc.DisplayIndex = 0)
|
この書き方だと
例えばdgc.DisplayIndex = 11のデータがあるとすると、
合計で11回 論理式判定が呼び出される。
0〜10の間という条件判定だったら
dgc.DisplayIndex >= 0 AND dgc.DisplayIndex <=10
だったら論理式判定は2回で済むはず。
50列中40列非表示は如何なものかと思うが、
それはさておき、コーディングも遅くしている原因だと思う。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2006-11-06 12:22
引用: |
|
platiniさんの書き込み (2006-11-06 12:19) より:
この書き方だと
例えばdgc.DisplayIndex = 11のデータがあるとすると、
合計で11回 論理式判定が呼び出される。
|
OrElse ではなく Or ですから、DisplayIndex が 11 でなくとも、必ず 11 回判定が発生しますね。
引用: |
|
タニさんの書き込み (2006-11-06 11:20) より:
この様な形でVisibleの設定をしているのですが、データ量が多いとかなりの時間(400件のデータを表示するのに1分弱)掛かってしまいます。
ある程度現状の状態を保ったままもう少し表示速度を早めたいと思っているのですが何か良い方法は無いでしょうか。
|
思いつくのは、Width = 0 ですね。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2006-11-06 13:35
引用: |
|
タニさんの書き込み (2006-11-06 11:20) より:
DataGridViewに50列のデータを表示し、その後40列のデータを非表示にする為に
必要な項目を表示にする()
For Each dgc As DataGridViewColumn In Me.DataGridView1.Columns
If Not (dgc.DisplayIndex = 1 Or dgc.DisplayIndex = 2 Or dgc.DisplayIndex = 3 Or dgc.DisplayIndex = 4 _
Or dgc.DisplayIndex = 5 Or dgc.DisplayIndex = 6 Or dgc.DisplayIndex = 7 Or dgc.DisplayIndex = 8 _
Or dgc.DisplayIndex = 9 Or dgc.DisplayIndex = 10 Or dgc.DisplayIndex = 0) Then
dgc.Visible = False
End If
Next
|
僕なら、以下のようにします。
コード: |
|
Private Sub ほげほげ()
For Each dgc As DataGridViewColumn In Me.DataGridView1.Columns
If (Not Me.IsVisible(dgc.DisplayIndex)) Then
dgc.Visible = False
End If
Next
End Sub
Private Function IsVisible(ByVal Index As Integer) As Boolean
if (Index = 1) Then Return(False)
if (Index = 2) Then Return(False)
:
Return(True)
End Function
|
最も可能性の高い番号を上部に持っていくのが高速化のコツみたいです。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2006-11-06 14:47
引用: |
|
R・田中一郎さんの書き込み (2006-11-06 13:35) より:
僕なら、以下のようにします。
最も可能性の高い番号を上部に持っていくのが高速化のコツみたいです。
|
私なら、コンパイラの最適化を信じて、Select Case を使いますね。
コード: |
|
Select Case dgc.DisplayIndex
Case 0 To 10
'/ 何もしない
Case Else
tgc.Visible = False
End Select
|
しかし、今回のボトルネックは、コーディングではなく、Visible = false のコストだと考えています。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- NZ-000
- 会議室デビュー日: 2005/10/31
- 投稿数: 7
|
投稿日時: 2006-11-06 15:24
とりあえず、もしAutoSize機能がオンになっているのならオフにしてみたらどうでしょう?
|
- platini
- 大ベテラン
- 会議室デビュー日: 2002/12/03
- 投稿数: 193
|
投稿日時: 2006-11-06 19:12
まさか、まさかと思うが、
データの各レコード単位のループの中で
引用: |
|
For Each dgc As DataGridViewColumn In Me.DataGridView1.Columns
If Not (dgc.DisplayIndex = 1 Or dgc.DisplayIndex = 2 Or dgc.DisplayIndex = 3 Or dgc.DisplayIndex = 4 _
Or dgc.DisplayIndex = 5 Or dgc.DisplayIndex = 6 Or dgc.DisplayIndex = 7 Or dgc.DisplayIndex = 8 _
Or dgc.DisplayIndex = 9 Or dgc.DisplayIndex = 10 Or dgc.DisplayIndex = 0) Then
dgc.Visible = False
End If
Next
|
を実行している(すなわち、レコード回数分、
このループ処理が呼び出されている)
なんてオチではないでしょうね?
|