DevExpress WinForms中文教程:Grid View - 如何实现识别行操作?(二)
DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
在本教程中,您将了解到DevExpress WinForms网格视图标识其行的方式。
- 数据源行索引
- 行处理
- 可见索引
在上文中(点击这里回顾>>),我们为大家介绍了纯数据中的行标识符、排序和过滤数据时行标识符之间的差异等,本文将继续介绍分组数据时行标识符之间的差异、特殊行句柄等,欢迎下载最新版组件体验~
获取DevExpress WinForms v24.2正式版下载
DevExpress技术交流群11:749942875 欢迎一起进群讨论
分组数据时行标识符之间的差异
行句柄和数据源索引之间的差异
接下来看看分组数据时会发生什么,行句柄和数据源索引之间的关键区别之一是,组行的行句柄是负整数。显然没有用于组行的数据源索引,因为它们不存在于数据源中,因此组行中显示的值是组中第一个数据行的索引。还有一件值得注意的事情是,数据行的句柄总是非负整数。

使用行句柄遍历行
如果您想遍历网格控件内存中的所有行,可以简单地枚举从0到View的BaseView.DataRowCount属性的行句柄。
看一下Clear Name按钮的Click事件处理程序,它正是这样做的,以便为所有当前加载的行清除Name列中的值。处理程序代码被封装到BaseView.BeginUpdate和BaseView.EndUpdate方法调用中,以避免对视图进行多次更新。它从等于0的行句柄开始,然后枚举到BaseView.DataRowCount属性值为止的所有整数,循环体调用ColumnView.SetRowCellValue 方法来清除Name列中的值。
C#
private void barButtonClearName_ItemClick(object sender, ItemClickEventArgs e) { gridView1.BeginUpdate(); int rowHandle = 0; while (rowHandle < gridView1.DataRowCount) { gridView1.SetRowCellValue(rowHandle, colName, string.Empty); rowHandle++; } gridView1.EndUpdate(); }
运行应用程序。首先过滤记录,只显示Audis,单击该按钮并查看清除的名称。现在删除过滤并通过Make对数据进行分组,您将看到Audis组中的Name列已被清除,但其他品牌仍然拥有该数据。

因此只有匹配筛选条件的行才会加载到内存中,如果现在按Clear Name 按钮,更改将影响展开或折叠组中的所有行。
行句柄和可见索引之间的差异
分组视图还揭示了行句柄和可见索引之间的重要区别。首先,可见索引仍然从0开始,并且该值随着每个可见行(无论是组行还是数据行)而增加。其次,您会注意到行句柄已经分配给加载到内存中的所有行,包括折叠组中的行,对组行的展开和折叠操作不会影响行句柄。另一方面,可视索引将在每次展开状态更改时重新计算,以考虑已变为可见或隐藏的行。
使用可见索引
为了说明可见索引的用法,实现一个导航到视图中下一个可见行的按钮——这是按下DOWN键的替代方法。处理程序首先使用GridView.GetVisibleIndex 方法确定焦点行的可见索引,该方法将行句柄作为参数。接下来代码增加获得的可见索引,最后使用GridView.GetVisibleRowHandle 方法将其转换回行句柄值,并使用这个新获得的句柄设置焦点。
C#
private void barButtonNextRow_ItemClick(object sender, ItemClickEventArgs e) { int visibleIndex = gridView1.GetVisibleIndex(gridView1.FocusedRowHandle); visibleIndex++; gridView1.FocusedRowHandle = gridView1.GetVisibleRowHandle(visibleIndex); }
特殊行句柄
本教程中最后值得一提的一点是,为特殊类型的行(如New Item Row)分配预定义的行句柄值。

要查看如何使用这些预定义值,请处理ColumnView.BeforeLeaveRow事件。网格控件具有指定它们的静态字段,这还包括GridControl.InvalidRowHandle值,如果无法获得行句柄,则由某些方法返回该值。在代码中,检查当前行是否为New Item Row,如果是,则显示确认消息框。
C#
private void gridView1_BeforeLeaveRow(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { if (e.RowHandle == DevExpress.XtraGrid.GridControl.NewItemRowHandle) { DialogResult result = MessageBox.Show("Are you done editing the new record?", "Confirmation", MessageBoxButtons.YesNo); e.Allow = (result == System.Windows.Forms.DialogResult.Yes); } }
运行应用程序,聚焦新建项目行,然后尝试将焦点更改回其中一个数据行。如果单击“No”,焦点将保持不变。

将行标识符相互转换
网格视图提供了允许您将行标识符相互转换的方法,要了解其工作原理,请分析在此应用程序中显示行索引信息的处理程序。
有三列,一列显示可见索引,另一行显示句柄,第三列显示数据源索引,该代码首先使用作为参数传递的行句柄获取数据源索引。然后使用行句柄确定可见索引,之后所有的值都显示在相应的列中。
C#
using DevExpress.XtraGrid.Views.Grid; //... private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { GridView view = sender as GridView; int dataSourceRowIndex = view.GetDataSourceRowIndex(e.RowHandle); int visibleIndex = view.GetVisibleIndex(e.RowHandle); if(e.Column.FieldName == "gridColumnRowHandle") e.DisplayText = e.RowHandle.ToString(); if(e.Column.FieldName == "gridColumnVisibleIndex") e.DisplayText = visibleIndex.ToString(); if(e.Column.FieldName == "gridColumnListSourceIndex") e.DisplayText = dataSourceRowIndex.ToString(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-03-05 如何开发Angular应用的仪表板功能?这里有答案
2019-03-05 自动化测试工具Telerik Test Studio发布R1 2019|附下载