C# treeview滚动条事件
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滚动条事件相关推荐
- win32通用控件TreeView滚动条自绘
<标题>win32通用控件TreeView滚动条自绘 直接使用windows sdk 进行开发自绘滚动条是很让人蛋疼的,嫌消息HOOK 麻烦,又不了解第三方控件,别担心,你还有一条小路可走 ...
- 为窗口添加滚动条事件
为窗口添加滚动条事件其实非常的简单, window.οnscrοll=function(){}; 注意在获取滚动条距离的时候 谷歌不识别document.documentElement.scrollT ...
- Vue监听滚动条事件 点击回到顶部
Vue监听滚动条事件 点击回到顶部 监听滚顶条事件: created () {this.listenerFunction(); }, beforeDestroy () {document.remove ...
- js控制右侧滚动条事件
js控制右侧滚动条事件 css代码 <style>*{margin: 0;padding: 0;}body{height: 3000px;}.top{background-color: t ...
- vue @scroll 监听滚动条事件
vue @scroll 监听滚动条事件 为啥要使用 @scroll 监听滚动条事件 没用在vue.js 开发前 我们监听滚动条事件都是在window挂监听事件 例如:window.onscroll = ...
- 滚动条分页/滚动条事件触发
使用jquery框架实现滚动条分页/滚动条事件触发,简单明了 //滚动条事件 record-dataTable-tbody是被滚动的标签的ID,可以是div,table,table里面的tbody等 ...
- html页面滚动条监听事件,jquery如何监听滚动条事件?
jquery如何监听滚动条事件?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 问题: 在浏览很多网页中都会发现,当滚动条滚动到一定的位置的时候就出显示一 ...
- js操作滚动条事件实例
本文实例讲述了js操作滚动条事件的方法.分享给大家供大家参考.具体分析如下: 之前一直很纳闷,如何监视滚动条的事件,今天终于有点明白了. 下边代码,是监听滚动条只要移动,下方的返回顶部的div显示与隐 ...
- JS 监听滚动条事件
JS 监听滚动条事件 获取滚动条位置代码 监听滚动条方法 效果 获取滚动条位置代码 /** * 获取滚动条位置 */ function getScrollTop() {var scrollPos;if ...
最新文章
- 应用程序池超出其作业限制设置_网站改版注意事项 - 蜘蛛池
- bga焊盘怎么做_BGA封装的类型及焊盘设计的基本要求有哪些
- 【转】全排列算法非递归实现和递归实现
- 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】
- element 时间选择器——年
- UML--实现图(组件图、配置图)
- 深入浅出Linux设备驱动编程--复杂设备驱动
- 强烈推荐的GitHub浏览插件-Octotree
- linux系统 安卓系统安装教程,在Linux系统上安装Android 4.4图文教程
- 5064. 删除字符串中的所有相邻重复项
- 这可能是史上最全的常用学术网站
- php取余函数,php 取余数详解
- 商品ETF的分类及运作模式
- (转)Ogre 天龙八部 GridInfo文件格式说明(正确版)
- c++之getopt函数的使用
- Linux搭建邮箱服务器
- 存储过程与函数 - 存储函数的使用
- 特异性敏感性的意义_敏感性特异性和有意义的分类
- 青海哈里哈图国家森林公园雪景美若人间仙境
- 静态工作点是什么?有什么作用?
热门文章
- 整理玩具 第九届蓝桥杯决赛第四题 java实现
- 调用聚合数据API实现手机号码归属地查询
- 虚拟机Ubuntu20.04安装NVIDIA显卡驱动失败原因
- DIV+CSS+JS二级树型菜单,刷新无影响
- 桌面文件夹不见了怎么恢复?教你简单的方法!
- TCP/IP 五层(或四层)模型
- 电热水器工作过程 c语言,电热水器工作原理—电热水器工作原理及使用注意事项介绍...
- python 根据答案 自动答题器_Python头脑王者答题器
- 机器人的柔顺控制概述
- Android 中MeasureSpec的创建规则