C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

MSHFlexGridの表示が遅い

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■84546 / inTopicNo.1)  MSHFlexGridの表示が遅い
  
□投稿者/ わりお (1回)-(2017/07/14(Fri) 11:16:01)

分類:[.NET 全般] 

2017/07/14(Fri) 11:19:12 編集(投稿者)
2017/07/14(Fri) 11:19:10 編集(投稿者)
2017/07/14(Fri) 11:18:37 編集(投稿者)
2017/07/14(Fri) 11:18:33 編集(投稿者)

ある処理を行い、作成したcsvファイルのデータをMSHFlexGridに表示しようとしたのですが表示が遅く感じます。
プログラム自体はこの部分が遅いだけで正しく動作します。動作環境はi3-2120 RAMは4GB vb2010です。

'ファイル3を読み込み、MSHFlexGridに表示
FileOpen(FileNo3, strVal3, OpenMode.Input)

With Form3.MSHFlexGrid1

.Visible = False
.Redraw = False

Do Until EOF(FileNo3)

strLine = LineInput(FileNo3)
CellsData = Split(strLine, ",")

If Form3.MSHFlexGrid1.get_Cols() < UBound(CellsData) + 1 Then

'データの列数に合わせて、MSHFlexGridの列数を設定
Form3.MSHFlexGrid1.set_Cols(UBound(CellsData) + 1)

End If

lngcount = lngcount + 1

'行数カウント
If lngcount > 2 Then

Form3.MSHFlexGrid1.Rows = Form3.MSHFlexGrid1.Rows + 1

End If

For n = LBound(CellsData) To UBound(CellsData)

'MSHFlexGridのセルにデータを書き込み
Form3.MSHFlexGrid1.set_TextMatrix(lngcount - 1, n, CellsData(n))

Next n
Loop

'セル幅を項目ごとに調整
.set_ColWidth(0, 900)
.set_ColWidth(1, 900)
.set_ColWidth(2, 600)
.set_ColWidth(3, 1000)
.set_ColWidth(4, 1000)
.set_ColWidth(5, 1000)
.Visible = True
.Redraw = True

End With

FileClose(FileNo3)


Form3.Show()

ネットで調べてvisibleやRedrawをFalseにして、セルに値をセットし終わった後にTrueにしているのですが以前遅いです。
csvファイルは6列12万行です。掛かる時間は3分半ほどです。これ以上速くすることは出来ないのでしょうか?

引用返信 編集キー/
■84548 / inTopicNo.2)  Re[1]: MSHFlexGridの表示が遅い
□投稿者/ 魔界の仮面弁士 (1343回)-(2017/07/14(Fri) 12:23:51)
No84546 (わりお さん) に返信
> ある処理を行い、作成したcsvファイルのデータをMSHFlexGridに表示しようとしたのですが表示が遅く感じます。
まるで VB6 のコードを直訳したかのようなコードになっていて、
.NET らしいコードになっていないのが気になるところ…。

たとえば、LineInput 関数を使うよりも、
File.ReadLines メソッドを使うなどした方が楽そうです。

それと、MSHFlexGrid の set_TextMatrix メソッドで
書き込むのはあまりオススメしません。これは 1 セルずつの
操作になりますので、操作回数が増える分、処理速度に影響します。


RowSel / ColSel / Clip プロパティと StringBuilder を使って、
複数のセル範囲にまとめて書き込むことを検討してみてください。


> With Form3.MSHFlexGrid1
ここで With にキャッシュしているのに、その内側では
>  If Form3.MSHFlexGrid1.get_Cols() < UBound(CellsData) + 1 Then
>   Form3.MSHFlexGrid1.set_Cols(UBound(CellsData) + 1)
>   Form3.MSHFlexGrid1.Rows = Form3.MSHFlexGrid1.Rows + 1
となっていて、With が活かされていません。
引用返信 編集キー/
■84551 / inTopicNo.3)  Re[2]: MSHFlexGridの表示が遅い
□投稿者/ 魔界の仮面弁士 (1344回)-(2017/07/14(Fri) 12:56:14)
No84548 (魔界の仮面弁士) に追記
>> csvファイルは6列12万行です。掛かる時間は3分半ほどです。これ以上速くすることは出来ないのでしょうか?
> RowSel / ColSel / Clip プロパティと StringBuilder を使って、
> 複数のセル範囲にまとめて書き込むことを検討してみてください。

csv ファイルからの転送ではありませんが、Clip プロパティを利用したところ、
10列15万行を 1 秒未満で表示できました。


Public Class Form1
 Private Function CreateSample() As String(,)
  '10列×15万行
  Dim ary(9, 149999) As String
  For y = 0 To ary.GetUpperBound(1)
   For x = 0 To ary.GetUpperBound(0)
    ary(x, y) = CStr(x + 1) & "列" & CStr(y + 1) & "行目"
   Next
  Next
  Return ary
 End Function

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim data As String(,) = CreateSample()

  '測定開始
  Dim sw As Stopwatch = Stopwatch.StartNew()

  '転送用データの構築
  Dim sb As New System.Text.StringBuilder()
  For y = 0 To data.GetUpperBound(1)
   sb.Append(data(0, y))
   For x = 1 To data.GetUpperBound(0)
    sb.Append(vbTab & data(x, y))
   Next
   sb.Append(vbCr)
  Next
  Debug.WriteLine("データ準備完了:" & sw.Elapsed.ToString())

  With Me.AxMSHFlexGrid1
   .Redraw = False
   .FixedRows = 0
   .FixedCols = 0
   .Rows = data.GetUpperBound(1) + 1
   .set_Cols(data.GetUpperBound(0) + 1)
   Debug.WriteLine("表サイズ決定:" & sw.Elapsed.ToString())

   '列幅設定
   For c = 0 To .get_Cols()
    .set_ColWidth(c, 1440)
   Next
   Debug.WriteLine("列幅調整:" & sw.Elapsed.ToString())

   '範囲選択
   .Row = 0
   .Col = 0
   .RowSel = data.GetUpperBound(1)
   .ColSel = data.GetUpperBound(0)

   'データ転記
   .Clip = sb.ToString()
   Debug.WriteLine("データ転送完了:" & sw.Elapsed.ToString())

   .Row = 0
   .Col = 0
   .Redraw = True
  End With

  '測定終了
  sw.Stop()

  MessageBox.Show(sw.Elapsed.ToString())
 End Sub
End Class
引用返信 編集キー/
■84552 / inTopicNo.4)  Re[2]: MSHFlexGridの表示が遅い
□投稿者/ わりお (2回)-(2017/07/14(Fri) 14:50:32)
No84548 (魔界の仮面弁士 さん) に返信
> ■No84546 (わりお さん) に返信
>>ある処理を行い、作成したcsvファイルのデータをMSHFlexGridに表示しようとしたのですが表示が遅く感じます。
> まるで VB6 のコードを直訳したかのようなコードになっていて、
> .NET らしいコードになっていないのが気になるところ…。
>
> たとえば、LineInput 関数を使うよりも、
> File.ReadLines メソッドを使うなどした方が楽そうです。
>
> それと、MSHFlexGrid の set_TextMatrix メソッドで
> 書き込むのはあまりオススメしません。これは 1 セルずつの
> 操作になりますので、操作回数が増える分、処理速度に影響します。
>
>
> RowSel / ColSel / Clip プロパティと StringBuilder を使って、
> 複数のセル範囲にまとめて書き込むことを検討してみてください。
>
>
>>With Form3.MSHFlexGrid1
> ここで With にキャッシュしているのに、その内側では
>> If Form3.MSHFlexGrid1.get_Cols() < UBound(CellsData) + 1 Then
>>  Form3.MSHFlexGrid1.set_Cols(UBound(CellsData) + 1)
>>  Form3.MSHFlexGrid1.Rows = Form3.MSHFlexGrid1.Rows + 1
> となっていて、With が活かされていません。

ありがとうございます。ご察しの通りVB6で作成したプログラムに変換を掛けたものです。
確かに.Netに移行した利点が生かされていないですね。改良できるところは直そうと思います。
コードを書き直したらここに載せようと思います。ありがとうございました。
解決済み
引用返信 編集キー/
■84554 / inTopicNo.5)  Re[3]: MSHFlexGridの表示が遅い
□投稿者/ ぶなっぷ (117回)-(2017/07/14(Fri) 16:55:26)
12万行というと、仮想スクロールを検討すべきかもしれません。
本家、FlexGridにはそういう機能があるのですが、
MSHFlexGridにもあるのかどうかは未確認です。
  http://demo.grapecity.com/c1/aspnet/5/mvcexplorer/FlexGrid/VirtualScrolling

引用返信 編集キー/
■84555 / inTopicNo.6)  Re[4]: MSHFlexGridの表示が遅い
□投稿者/ 魔界の仮面弁士 (1345回)-(2017/07/14(Fri) 18:33:40)
No84554 (ぶなっぷ さん) に返信
> 12万行というと、仮想スクロールを検討すべきかもしれません。
> 本家、FlexGridにはそういう機能があるのですが、
> MSHFlexGridにもあるのかどうかは未確認です。

MSFlexGrid や MSHFlexGrid に仮想モードはありません。


別案ということであれば、ActiveX Data Object を使う選択肢もあります。
OLE DB Provider としては Microsoft.ACE.OLEDB.12.0 プロバイダー か ODBC が使えます。


下記は、C:\TEMP\TEST.CSV を表示する例です。

Public Class Form1
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim rs As New ADODB.Recordset()
  rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
  rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic
  rs.LockType = ADODB.LockTypeEnum.adLockReadOnly
  rs.Open("SELECT * FROM [test#csv]", "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=C:\temp\;Extensions=csv;")
  AxMSHFlexGrid1.DataSource = rs
 End Sub
End Class


SCHEMA.INI の設定を行うことをオススメしますが、元のコードのように
一行ずつ読み取って加工したいのであれば、スタンドアロンの切断型 Recordset を
割り当てるという選択肢もあります。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ