C# treeview滚动条事件

  • 问题描述
  • 解决思路
  • 代码

问题描述

TreeView过长;
不点击节点,鼠标滚轮可以让滚动条滚动;
点击节点,按住不放,拖拽节点到页面外部,页面不会自动滚动,鼠标滚轮也不会让滚动条滚动。

解决思路

在查过官方文档就知道C#的treeview封装了滚动条事件,没有提供相应的api接口,想要重载滚动条的事件是行不通的。

由于只有按住节点的时候才有这个滚动的需求,因此我想了一种“曲线救国”的方法:重载TreeView的拖拽事件。

QueryContinueDrag(object sender, QueryContinueDragEventArgs e)

这个是TreeView的拖拽事件,处于节点拖拽状态下才会触发该事件函数。

如果C#写多了,就会知道TreeView有个节点跳转的功能,类似页面右下角的“返回顶部”的功能,只要把焦点定位和拖拽就可以让页面自动滚动。

(我没实现重载拖拽时的鼠标滚轮,因为节点焦点乱飘不适合我的需求)

代码

事前工作1:向上、向下滚动定时器

/// <summary>
/// 拖拽上滚动定时器
/// </summary>
private Timer ScrollUpDelayTimer = new Timer();/// <summary>
/// 编辑器拖拽下滚动定时器
/// </summary>
private Timer ScrollDownDelayTimer = new Timer();public MYTreeView()
{InitializeComponent();// 初始化拖拽滚动定时器// 初始化时间ScrollUpDelayTimer.Interval = ScrollDelayTimerMS;ScrollDownDelayTimer.Interval = ScrollDelayTimerMS;// 初始化事件ScrollUpDelayTimer.Tick += new EventHandler(ScrollUpEvent);ScrollDownDelayTimer.Tick += new EventHandler(ScrollDownEvent);
}

事前工作2:向上、向下滚动事件

/// <summary>
/// 向上滚
/// </summary>
/// <param name="currentIndex"></param>
private void ScrollUp()
{int currentIndex = treeView.SelectedNode.Index;if (currentIndex >= 1){currentIndex--;treeView.SelectedNode = treeView.Nodes[currentIndex];treeView.Nodes[currentIndex].EnsureVisible();}
}private void ScrollUpEvent(object sender, EventArgs e)
{ScrollUp();
}/// <summary>
/// 向下滚
/// </summary>
/// <param name="currentIndex"></param>
private void ScrollDown()
{    int currentIndex = treeView.SelectedNode.Index;if (currentIndex < treeView.Nodes.Count - 1){currentIndex++;treeView.SelectedNode = treeView.Nodes[currentIndex];treeView.Nodes[currentIndex].EnsureVisible();int childIndex = this.treeView.Nodes[currentIndex].Nodes.Count - 1;if (childIndex >= 0){treeView.Nodes[currentIndex].Nodes[childIndex].EnsureVisible();}}
}private void ScrollDownEvent(object sender, EventArgs e)
{ScrollDown();
}

准备完成,重载TreeView的拖拽事件

/// <summary>
/// 拖拽改变滚动条位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MYTreeView_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{TreeNode node = treeView.SelectedNode;Point currentPoint = treeView.PointToClient(new Point(Control.MousePosition.X, Control.MousePosition.Y));while (node.Parent != null){node = node.Parent;}int currentIndex = node.Index;if (currentPoint.Y < 0 && currentIndex >= 1){ScrollUpDelayTimer.Start();}else if (currentPoint.Y > treeView.Height && currentIndex < treeView.Nodes.Count - 1){ScrollDownDelayTimer.Start();}else{ScrollUpDelayTimer.Stop();ScrollDownDelayTimer.Stop();}
}

为了方便测试,还可以加个快捷键在里面

/// <summary>
/// 拖拽改变滚动条位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FlowEditorTreeView_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{TreeNode node = treeView.SelectedNode;Point currentPoint = treeView.PointToClient(new Point(Control.MousePosition.X, Control.MousePosition.Y));while (node.Parent != null){node = node.Parent;}int currentIndex = node.Index;// CTRL向上滚, ALT向下滚if (e.KeyState == 9 || e.KeyState == 33){if (e.KeyState == 9 && currentIndex >= 1){ScrollUp();}else if (e.KeyState == 33 && currentIndex < treeView.Nodes.Count - 1){ScrollDown();}}else{if (currentPoint.Y < 0 && currentIndex >= 1){ScrollUpDelayTimer.Start();}else if (currentPoint.Y > treeView.Height && currentIndex < treeView.Nodes.Count - 1){ScrollDownDelayTimer.Start();}else{ScrollUpDelayTimer.Stop();ScrollDownDelayTimer.Stop();}}
}

C# treeview滚动条事件相关推荐

  1. win32通用控件TreeView滚动条自绘

    <标题>win32通用控件TreeView滚动条自绘 直接使用windows sdk 进行开发自绘滚动条是很让人蛋疼的,嫌消息HOOK 麻烦,又不了解第三方控件,别担心,你还有一条小路可走 ...

  2. 为窗口添加滚动条事件

    为窗口添加滚动条事件其实非常的简单, window.οnscrοll=function(){}; 注意在获取滚动条距离的时候 谷歌不识别document.documentElement.scrollT ...

  3. Vue监听滚动条事件 点击回到顶部

    Vue监听滚动条事件 点击回到顶部 监听滚顶条事件: created () {this.listenerFunction(); }, beforeDestroy () {document.remove ...

  4. js控制右侧滚动条事件

    js控制右侧滚动条事件 css代码 <style>*{margin: 0;padding: 0;}body{height: 3000px;}.top{background-color: t ...

  5. vue @scroll 监听滚动条事件

    vue @scroll 监听滚动条事件 为啥要使用 @scroll 监听滚动条事件 没用在vue.js 开发前 我们监听滚动条事件都是在window挂监听事件 例如:window.onscroll = ...

  6. 滚动条分页/滚动条事件触发

    使用jquery框架实现滚动条分页/滚动条事件触发,简单明了 //滚动条事件 record-dataTable-tbody是被滚动的标签的ID,可以是div,table,table里面的tbody等 ...

  7. html页面滚动条监听事件,jquery如何监听滚动条事件?

    jquery如何监听滚动条事件?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 问题: 在浏览很多网页中都会发现,当滚动条滚动到一定的位置的时候就出显示一 ...

  8. js操作滚动条事件实例

    本文实例讲述了js操作滚动条事件的方法.分享给大家供大家参考.具体分析如下: 之前一直很纳闷,如何监视滚动条的事件,今天终于有点明白了. 下边代码,是监听滚动条只要移动,下方的返回顶部的div显示与隐 ...

  9. JS 监听滚动条事件

    JS 监听滚动条事件 获取滚动条位置代码 监听滚动条方法 效果 获取滚动条位置代码 /** * 获取滚动条位置 */ function getScrollTop() {var scrollPos;if ...

最新文章

  1. 应用程序池超出其作业限制设置_网站改版注意事项 - 蜘蛛池
  2. bga焊盘怎么做_BGA封装的类型及焊盘设计的基本要求有哪些
  3. 【转】全排列算法非递归实现和递归实现
  4. 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】
  5. element 时间选择器——年
  6. UML--实现图(组件图、配置图)
  7. 深入浅出Linux设备驱动编程--复杂设备驱动
  8. 强烈推荐的GitHub浏览插件-Octotree
  9. linux系统 安卓系统安装教程,在Linux系统上安装Android 4.4图文教程
  10. 5064. 删除字符串中的所有相邻重复项
  11. 这可能是史上最全的常用学术网站
  12. php取余函数,php 取余数详解
  13. 商品ETF的分类及运作模式
  14. (转)Ogre 天龙八部 GridInfo文件格式说明(正确版)
  15. c++之getopt函数的使用
  16. Linux搭建邮箱服务器
  17. 存储过程与函数 - 存储函数的使用
  18. 特异性敏感性的意义_敏感性特异性和有意义的分类
  19. 青海哈里哈图国家森林公园雪景美若人间仙境
  20. 静态工作点是什么?有什么作用?

热门文章

  1. 整理玩具 第九届蓝桥杯决赛第四题 java实现
  2. 调用聚合数据API实现手机号码归属地查询
  3. 虚拟机Ubuntu20.04安装NVIDIA显卡驱动失败原因
  4. DIV+CSS+JS二级树型菜单,刷新无影响
  5. 桌面文件夹不见了怎么恢复?教你简单的方法!
  6. TCP/IP 五层(或四层)模型
  7. 电热水器工作过程 c语言,电热水器工作原理—电热水器工作原理及使用注意事项介绍...
  8. python 根据答案 自动答题器_Python头脑王者答题器
  9. 机器人的柔顺控制概述
  10. Android 中MeasureSpec的创建规则