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

■35349 / 親記事)  TreeViewとDataGridViewのスクロールを同期(シンクロ)させたい
  
□投稿者/ 炎の妖精さん 一般人(24回)-(2023/01/25(Wed) 13:50:23)
  • アイコン環境/言語:[Win10(64bit)_VB.NET(Framework 3.5)_MVB2010Express] 
    分類:[.NET] 

    お世話になっております。

    フォームにTreeView(左側)とDataGridView(右側)を配置しており、
    表示させるデータ件数はどちらのコントロールも同じ件数分、表示されています。

    TreeView側のコントロールにて
    マウスホイールやスクロールバーを移動させるとスクロール量分、DataGridViewをスクロールさせたいです。

    同様に
    DataGridView側のコントロールにて
    マウスホイールやスクロールバーを移動させるとスクロール量分、TreeViewもスクロールします。


    コントロールプロパティを確認したのですが、
    TreeViewにはScrollイベント関数が用意されていないようでした。
    どのようにすればいいのでしょうか?
マルチポストを報告
違反を報告
引用返信 削除キー/
■35350 / ResNo.1)  Re[1]: TreeViewとDataGridViewのスクロールを同期(シンクロ)させたい
□投稿者/ 魔界の仮面弁士 大御所(1525回)-(2023/01/25(Wed) 17:59:23)
  • アイコンNo35349に返信(炎の妖精さんさんの記事)
    > コントロールプロパティを確認したのですが、
    > TreeViewにはScrollイベント関数が用意されていないようでした。

    ありません。

    強いて言えば、 No35344 で示したように、
    TreeView の WndProc メソッドを Overrides して捉えるぐらいかと。

    サンプルを書いてみました。
    https://gist.github.com/Benshi/0042cb7b23ca310181bff15c4c3a0042
違反を報告
引用返信 削除キー/
■35351 / ResNo.2)  Re[2]: TreeViewとDataGridViewのスクロールを同期(シンクロ)させたい
□投稿者/ 魔界の仮面弁士 大御所(1526回)-(2023/01/25(Wed) 20:54:52)
  • アイコンNo35350に追記(魔界の仮面弁士の記事)
    > サンプルを書いてみました。
    > https://gist.github.com/Benshi/0042cb7b23ca310181bff15c4c3a0042

    上記実装を追加検証してみましたが、まだまだ不具合がありますね。

    (1) スクロールバーを押しっぱなしにしていると、
     終端に到達した後も Scroll イベントが発生し続けます。

    (2) 折りたたまれたノードを選択した状態で、そのノードを
    上側のスクロール領域外にし、そこで[→]あるいは[Num *]を押して
    ノードを展開した場合に、スクロールされるのにイベントが通知されません。


    各種パターンに追従させるのも面倒ですね…。

    こうなると、TopNode を Timer 監視した方が手っ取り早そうです。
    垂直スクロールしか検出できないですけれどね。

    Public Class Form1
      Public Event TreeViewScroll As EventHandler

      Private Sub Form1_TreeViewScroll(sender As Object, e As EventArgs) Handles Me.TreeViewScroll
        'ListBox1.Items.Insert(0, "Scrolled at " & Now.ToString("HH:mm:ss.fff"))
      End Sub

      Private topNode As TreeNode = Nothing
      Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        If TreeView1.TopNode IsNot Nothing Then
          If topNode IsNot TreeView1.TopNode Then
            topNode = TreeView1.TopNode
            RaiseEvent TreeViewScroll(TreeView1, EventArgs.Empty)
          End If
        End If
      End Sub
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Timer1.Interval = 150
        Timer1.Start()
      End Sub
    End Class


    あるいは、無理にスクロールを同期させようとするのではなく、
    No35346 の TreeGridView のように、最初から
    「ツリー表示対応のグリッドコントロール」を用いるとか。


    なお、先に例示したものとは別実装のツリー対応グリッドを探したところ、
    Eto.Forms の TreeGridView というのが見つかりました。
    https://github.com/picoe/Eto
    https://www.nuget.org/packages/Eto.Forms
    https://mokake.hatenablog.com/entry/2017/01/31/184421

    ただし Eto.Forms は、.NET Framework 3.5 には対応していないようです。
    一応 バージョン 2.3.0 以下であれば、.NET Framework 4 対応らしいので、
    ギリギリ VB2010 でも動かせるかもしれませんが…。(未確認)
違反を報告
引用返信 削除キー/
■35352 / ResNo.3)  Re[3]: TreeViewとDataGridViewのスクロールを同期(シンクロ)させたい
□投稿者/ 炎の妖精さん 一般人(25回)-(2023/01/26(Thu) 10:37:17)
  • アイコンNo35351に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様
    ご返信、及び動作検証ありがとうございます。

    TreeViewでスクロール実装するのは控えた方がよさそうですね。

    > あるいは、無理にスクロールを同期させようとするのではなく、
    > No35346 の TreeGridView のように、最初から
    > 「ツリー表示対応のグリッドコントロール」を用いるとか。
    そうですね。
    TreeGridViewの採用の検討材料とさせて頂きます。
解決み!
違反を報告
引用返信 削除キー/
■35353 / ResNo.4)  Re[3]: TreeViewとDataGridViewのスクロールを同期(シンクロ)させたい
□投稿者/ 炎の妖精さん 一般人(26回)-(2023/01/26(Thu) 13:57:58)
  • アイコンNo35351に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様
    ご返信、及び動作検証ありがとうございます。

    関係者と協議した結果、そのまま使って頂く事となりました。

    幸い、別の質問(No35341)にさせていただいた件では解決できたため、
    これなら問題ないという意見をもらいました。
    時間がありましたら、TreeGridViewや他コントロールの採用を検討させて頂く所存です。
解決み!
違反を報告
引用返信 削除キー/



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

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -