- PR -

データグリッドビューに関して

投稿者投稿内容
タニ
会議室デビュー日: 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


を実行している(すなわち、レコード回数分、
このループ処理が呼び出されている)
なんてオチではないでしょうね?

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