在 Windows 窗体 DataGridView 控件中使用新记录行
在应用程序中使用 DataGridView 编辑数据时,通常需要让用户能够向数据存储添加新的数据行。 DataGridView 控件通过为提供一个新记录行来支持此功能,新记录行始终显示为最后一行。 它的行标题中标有星号 (*)。 以下各节讨论了在启用了新记录行的情况下进行编程时应考虑的一些事项。
显示新记录行
使用 AllowUserToAddRows 属性指示是否显示新记录行。 此属性的默认值为 true
。
对于数据绑定的情况,如果控件的 AllowUserToAddRows 属性和数据源的 IBindingList.AllowNew 属性都为 true
,则将显示新记录行。 如果任一属性为 false
,则不会显示该行。
使用默认数据填充新记录行
当用户选择新记录行作为当前行时,DataGridView 控件引发 DefaultValuesNeeded 事件。
此事件提供对新 DataGridViewRow 的访问,并使你能够使用默认数据填充新行。 有关详细信息,请参阅如何:为 Windows 窗体 DataGridView 控件中的新行指定默认值
行集合
新记录行包含在 DataGridView 控件的 Rows 集合中,但在两个方面表现不同:
无法以编程方式从 Rows 集合中删除新记录行。 如果尝试执行此操作,则会引发 InvalidOperationException。 用户也无法删除新记录行。 DataGridViewRowCollection.Clear 方法不会从 Rows 集合中删除该行。
无法在新记录行后添加任何行。 如果尝试这样做,则会引发 InvalidOperationException。 因此,新记录行始终是 DataGridView 控件中的最后一行。 DataGridViewRowCollection 上添加行的方法(Add、AddCopy 和 AddCopies)都会在存在新记录行时在内部调用插入方法。
新记录行的可视化自定义
创建新记录行时,它基于 RowTemplate 属性指定的行。 未为此行指定的任何单元格样式都继承自其他属性。 有关单元格样式继承的详细信息,请参阅 Windows 窗体 DataGridView 控件中的单元格样式。
新记录行中单元格显示的初始值是从每个单元格的 DefaultNewRowValue 属性中检索的。 对于 DataGridViewImageCell 类型的单元格,此属性返回占位符图像。 否则,此属性返回 null
。 可以替代此属性以返回自定义值。 但是,当焦点进入新记录行时,这些初始值可以替换为 DefaultValuesNeeded 事件处理程序。
此行标题的标准图标(箭头或星号)不会公开显示。 如果要自定义图标,需要创建自定义 DataGridViewRowHeaderCell 类。
标准图标使用行标题单元格正在使用的 DataGridViewCellStyle 的 ForeColor 属性。 如果没有足够的空间完全显示标准图标,则不会呈现这些图标。
如果行标题单元格设置了字符串值,并且没有足够的空间同时显示文本和图标,则首先删除图标。
排序
在未绑定模式下,即使用户已对 DataGridView 的内容进行了排序,新记录也将始终添加到 DataGridView 的末尾。 用户需要再次应用排序才能将行排序到正确的位置;此行为类似于 ListView 控件的行为。
在数据绑定和虚拟模式下,应用排序时的插入行为将取决于数据模型的实现。 对于 ADO.NET,该行会立即排序到正确的位置。
关于新记录行的其他注意事项
无法将此行的 Visible 属性设置为 false
。 如果尝试这样做,则会引发 InvalidOperationException。
新记录行始终以未选中状态创建。
虚拟模式
如果要实现虚拟模式,需要跟踪数据模型中何时需要新记录行以及何时回滚该行的添加。 此功能的确切实现取决于数据模型的实现及其事务语义,例如,提交范围是单元格级别还是行级别。 有关详细信息,请参阅 Windows 窗体 DataGridView 控件中的虚拟模式。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈