DOBON.NETプログラミング道掲示板

■34073 / 親記事)  DatagridViewの行高さ変更について
  
□投稿者/ haru 一般人(1回)-(2018/12/23(Sun) 16:18:50)
  • アイコン環境/言語:[Windows10 VB2005] 
    分類:[.NET] 

    2018/12/23(Sun) 16:38:54 編集(投稿者)
    2018/12/23(Sun) 16:38:47 編集(投稿者)

    VB2005で開発しています。

    ユーザーがマウスで変えた行高さを他の行に反映するのは

    dim wkHeight as integer = ユーザーが変更した行の高さ

    for ix as integer = 0 to dgv.rows.count - 1
    dgv.rows(idx).height = wkHeight
    next ix

    この方法だと、rowheightchangedイベントに記載しているので
    表示されている行数分イベントが走り、とても遅くなります。


    なにかいい方法はありませんか?

マルチポストを報告
違反を報告
引用返信 削除キー/
■34074 / ResNo.1)  Re[1]: DatagridViewの行高さ変更について
□投稿者/ Hongliang 大御所(546回)-(2018/12/23(Sun) 16:55:25)
  • アイコン// さすがにVS2005はちょっと古すぎるのでは…。

    ・メンバ変数m_UserRowHeight(仮名)を定義、初期値は-1とする
    ・RowHeightInfoPushedイベントで、m_UserRowHeightにe.Heightを代入してDataGridView1.Invalidate()
    ・RowHeightInfoNeededイベントで、m_UserRowHeightが-1でなければe.Heightにm_UserRowHeightを代入

    というのはどうでしょうか。
違反を報告
引用返信 削除キー/
■34075 / ResNo.2)  Re[2]: DatagridViewの行高さ変更について
□投稿者/ haru 一般人(3回)-(2018/12/23(Sun) 18:00:17)
  • アイコン2005古いですよね・・・・そこは目をつむってください💦

    virtualmodeをtrueにしたらセルの値が何も表示されなくなってしまいました。
    うちの今の作り方では使えないかも。。。
    あ、datasouceも使ってないです。
違反を報告
引用返信 削除キー/
■34076 / ResNo.3)  Re[3]: DatagridViewの行高さ変更について
□投稿者/ 魔界の仮面弁士 大御所(1184回)-(2018/12/25(Tue) 11:36:41)
  • アイコン
    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 コントロールを拡張するための推奨される手順]

違反を報告
引用返信 削除キー/
■34078 / ResNo.4)  Re[4]: DatagridViewの行高さ変更について
□投稿者/ haru 一般人(5回)-(2018/12/25(Tue) 18:42:34)
  • アイコンHongliang 大御所さんも魔界の仮面弁士cさん。ありがとうございます。

    もう出来上がっているものなので勝手にあまり大幅には修正できないんですが、速度の遅さも問題になっているので一度提案してみます。
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -