2018/12/26(Wed) 01:34:25 編集(管理者)
■No34073に返信(haruさんの記事)
> for ix as integer = 0 to dgv.rows.count - 1> dgv.rows(idx).height = wkHeight
ix ≠ idx ですね…?
■No34075に返信(haruさんの記事)
> 💦
「汗」の絵文字ですね。
https://www.fileformat.info/info/unicode/char/1f4a6/index.htm
> virtualmodeをtrueにしたらセルの値が何も表示されなくなってしまいました。
仮想モードを有効にする(VirtualMode = True)ということは、
各種の通知イベントに応答してデータを渡す
というコーディングが必要であることを意味します。
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/implementing-virtual-mode-wf-datagridview-control
> あ、datasouceも使ってないです。
DataGridView を扱う場合、Rows コレクションを For / For Each で反復処理したり
Rows.Add したりすることは極力避けるべきです。
DataSource プロパティに BindingList や DataTable を割り当てて使用することは
パフォーマンス改善にも大きな効果がありますので、是非検討してみてください。
以下実験コード。
空の Form1 に貼って試してみてください。
20列×8192行の DataGridView が 2 つ表示されますが、
左グリッド(dgv1)は haru さんの No34073 案で高さを変更したもの
右グリッド(dgv2)は Hongliang さんの No34074 案で高さを変更したものです。
Public Class Form1
Private WithEvents sp As SplitContainer
Private WithEvents dgv1 As DataGridView
Private WithEvents dgv2 As DataGridView
Private dummyRows As System.ComponentModel.BindingList(Of Object)
Private userRowHeight As Integer = -1
Public Sub New()
Const InitialCowCount As Integer = 20
Const InitialRowCount As Integer = 8192
InitializeComponent()
sp = New SplitContainer()
sp.Dock = DockStyle.Fill
Controls.Add(sp)
dgv1 = New DataGridView()
dgv2 = New DataGridView()
dgv1.Dock = DockStyle.Fill
dgv2.Dock = DockStyle.Fill
dgv1.ColumnCount = InitialCowCount
dgv2.ColumnCount = InitialCowCount
dgv1.RowCount = InitialRowCount
'dgv2.RowCount = InitialRowCount
dummyRows = New System.ComponentModel.BindingList(Of Object)(New List(Of Object)(New Object(InitialRowCount - 1) {}))
dgv2.DataSource = dummyRows
dgv1.Parent = sp.Panel1
dgv2.Parent = sp.Panel2
dgv2.AllowUserToAddRows = True
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
sp.SplitterDistance = ClientSize.Width \ 2
End Sub
Private Sub dgv1_RowHeightChanged(sender As Object, e As DataGridViewRowEventArgs) Handles dgv1.RowHeightChanged
Dim dgv As DataGridView = DirectCast(sender, DataGridView)
Dim rows As DataGridViewRowCollection = dgv.Rows
RemoveHandler dgv.RowHeightChanged, AddressOf dgv1_RowHeightChanged
'ユーザーが変更した行の高さ
Dim wkHeight As Integer = e.Row.Height
For ix As Integer = rows.Count - 1 To 0 Step -1
rows(ix).Height = wkHeight
Next ix
AddHandler dgv.RowHeightChanged, AddressOf dgv1_RowHeightChanged
End Sub
Private Sub dgv2_RowHeightInfoPushed(sender As Object, e As DataGridViewRowHeightInfoPushedEventArgs) Handles dgv2.RowHeightInfoPushed
userRowHeight = e.Height
DirectCast(sender, DataGridView).Invalidate()
End Sub
Private Sub dgv2_RowHeightInfoNeeded(sender As Object, e As DataGridViewRowHeightInfoNeededEventArgs) Handles dgv2.RowHeightInfoNeeded
If userRowHeight <> -1 Then
e.Height = userRowHeight
End If
End Sub
End Class
併せて、Visual Studio 付属の MSDN ライブラリのチューニングに関する項もご覧ください。
[開発ツールと開発言語]
└[Visual Studio]
└[Windows ベースのアプリケーション、コンポーネント、サービス]
└[Windows ベースのアプリケーションの作成]
└[Windows フォーム]
└[Windows フォームについて]
└[Windows フォーム コントロール]
└[Windows フォームで使用するコントロール]
└[DataGridView コントロール]
└[[Windows フォーム DataGridView コントロールでのパフォーマンス チューニング]
└[Windows フォーム DataGridView コントロールを拡張するための推奨される手順]