AABBbaby

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

DevExpress WinForms中文教程:Grid View - 如何实现识别行操作?(二)

DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

在本教程中,您将了解到DevExpress WinForms网格视图标识其行的方式。

  • 数据源行索引
  • 行处理
  • 可见索引

在上文中(点击这里回顾>>),我们为大家介绍了纯数据中的行标识符、排序和过滤数据时行标识符之间的差异等,本文将继续介绍分组数据时行标识符之间的差异、特殊行句柄等,欢迎下载最新版组件体验~

获取DevExpress WinForms v24.2正式版下载

DevExpress技术交流群11:749942875      欢迎一起进群讨论

分组数据时行标识符之间的差异

行句柄和数据源索引之间的差异

接下来看看分组数据时会发生什么,行句柄和数据源索引之间的关键区别之一是,组行的行句柄是负整数。显然没有用于组行的数据源索引,因为它们不存在于数据源中,因此组行中显示的值是组中第一个数据行的索引。还有一件值得注意的事情是,数据行的句柄总是非负整数。

DevExpress WinForms中文教程图集

使用行句柄遍历行

如果您想遍历网格控件内存中的所有行,可以简单地枚举从0到View的BaseView.DataRowCount属性的行句柄。

看一下Clear Name按钮的Click事件处理程序,它正是这样做的,以便为所有当前加载的行清除Name列中的值。处理程序代码被封装到BaseView.BeginUpdateBaseView.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列已被清除,但其他品牌仍然拥有该数据。

DevExpress WinForms中文教程图集

因此只有匹配筛选条件的行才会加载到内存中,如果现在按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)分配预定义的行句柄值。

DevExpress WinForms中文教程图集

要查看如何使用这些预定义值,请处理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”,焦点将保持不变。

DevExpress WinForms中文教程图集
将行标识符相互转换

网格视图提供了允许您将行标识符相互转换的方法,要了解其工作原理,请分析在此应用程序中显示行索引信息的处理程序。

有三列,一列显示可见索引,另一行显示句柄,第三列显示数据源索引,该代码首先使用作为参数传递的行句柄获取数据源索引。然后使用行句柄确定可见索引,之后所有的值都显示在相应的列中。

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();
}

posted on   AABBbaby  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-03-05 如何开发Angular应用的仪表板功能?这里有答案
2019-03-05 自动化测试工具Telerik Test Studio发布R1 2019|附下载
点击右上角即可分享
微信分享提示