关于DevExpress GridView行头显示行号且根据行号宽度动态自适应显示

2024-06-23 11:18

本文主要是介绍关于DevExpress GridView行头显示行号且根据行号宽度动态自适应显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GridView的行头号默认没有显示,需要在事件CustomDrawRowIndicator中绘制行头号,行号显示代码如下

void CustomDrawRowIndicator (object sender, RowIndicatorCustomDrawEventArgs e){if (e.RowHandle >= 0){e.Info.DisplayText = (e.RowHandle + 1).ToString();}}

GridView默认的行头宽度较小,往往都需要设置GridView.IndicatorWidth属性来设置宽度,但是这个宽度是固定的,如果列表数据较大,设置小了后面的数据行号就会显示不全,如果设置较大,比如有1w行,那么在浏览前面的数据的时候会觉得显示太宽,不符合设计美观,着实让人别扭,如果可以动态的根据当前的行号大小来决定其行头 的宽度的话,那就perfect了。接下来让我来介绍实现步骤:

GridView提供TopRowChanged事件,当数据滚动的时候,就会触发到这个事件,那么我们就可以利用这个事件在滚动数据的时候来计算此时的显示的最大行号,进而来计算出该最大行号的宽度,计算宽度如下:

/// <summary>/// 计算行头宽度/// </summary>/// <param name="sender"></param>/// <returns></returns>int CalcIndicatorBestWidth(DevExpress.XtraGrid.Views.Grid.GridView view){Graphics graphics = new Control().CreateGraphics();SizeF sizeF = new SizeF();int count = view.TopRowIndex + ((DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)view.GetViewInfo()).RowsInfo.Count;if (count == 0){count = 30;}sizeF = graphics.MeasureString(count.ToString(), view.Appearance.Row.Font);return Convert.ToInt32(sizeF.Width) + 20;}

那么TopRowChanged事件可以这么写:

 private  void OnTopRowChanged(object sender, EventArgs e){GridView view = sender as GridView;if (view == null)return;int width = CalcIndicatorBestWidth(view);if ((view.IndicatorWidth - 4 < width || view.IndicatorWidth + 4 > width) && view.IndicatorWidth != width){view.IndicatorWidth = width;}}

为了方便大家复制黏贴,请查看以下代码复制黏贴到你的项目内,在构造函数内调用,传个gridview的参数即可:

public static void BindCustomDrawRowIndicator(DevExpress.XtraGrid.Views.Grid.GridView view){view.IndicatorWidth = CalcIndicatorDefaultWidth(view);view.CustomDrawRowIndicator += (s, e) =>{if (e.RowHandle >= 0){e.Info.DisplayText = (e.RowHandle + 1).ToString();}};view.TopRowChanged += (s, e) =>{int width = CalcIndicatorBestWidth(view);if ((view.IndicatorWidth - 4 < width || view.IndicatorWidth + 4 > width) && view.IndicatorWidth != width){view.IndicatorWidth = width;}};}/// <summary>/// 计算行头宽度/// </summary>/// <param name="sender"></param>/// <returns></returns>static int CalcIndicatorBestWidth(DevExpress.XtraGrid.Views.Grid.GridView view){Graphics graphics = new Control().CreateGraphics();SizeF sizeF = new SizeF();int count = view.TopRowIndex + ((DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)view.GetViewInfo()).RowsInfo.Count;if (count == 0){count = 30;}sizeF = graphics.MeasureString(count.ToString(), view.Appearance.Row.Font);return Convert.ToInt32(sizeF.Width) + 20;}/// <summary>/// 计算默认的宽度/// </summary>/// <param name="view"></param>/// <returns></returns>static int CalcIndicatorDefaultWidth(DevExpress.XtraGrid.Views.Grid.GridView view){var grid = view.GridControl;Graphics graphics = new Control().CreateGraphics();SizeF sizeF = new SizeF();int  rowHeight= 22;//22是Row的估计高度if (view.RowHeight > 0){rowHeight = view.RowHeight;}int count = grid != null ? grid.Height / rowHeight : 30;sizeF = graphics.MeasureString(count.ToString(), view.Appearance.Row.Font);return Convert.ToInt32(sizeF.Width) + 20;}

效果图:

源码下载 (源码多余,土豪请随意)

求打赏:

这篇关于关于DevExpress GridView行头显示行号且根据行号宽度动态自适应显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087005

相关文章

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu