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

No35351 の記事


■35351 / )  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 でも動かせるかもしれませんが…。(未確認)
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -