本主题说明如何为视图中 (仅在网格视图中可用) 的个别单元格提供内置编辑器。 在为列中所有单元格使用单个编辑器不能满足需求时,使用这种指派编辑器的方法。 如果需要为列中的所有单元格使用相同的编辑器,则使用另一种在 把编辑器指派到列和卡片字段 文档中描述的编辑器绑定方式。 内置编辑器概述 主题描述了在视图中使用编辑器的基础。
把编辑器指派到个别单元格
在运行时刻,可以通过接管 GridView.CustomRowCellEdit (或 LayoutView.CustomRowCellEdit) 事件把编辑器指派到个别单元格。 事件为每个可视的单元格动态发生,允许根据单元格的位置 (它的列和行),把编辑器提供到个别单元格。
通过此事件指派的编辑器被用于在显示模式中呈现单元格内容,并且在默认情况下用作内置编辑。 如果需要提供不同的用于编辑模式的编辑器,则接管 GridView.CustomRowCellEditForEditing 事件。 请参阅 指派内置编辑器 来获知细节。
注意 |
---|
如果接管了 GridView.CustomRowCellEdit 事件来为依赖于获得焦点状态的特定行提供编辑器,则此编辑器不能用于编辑。 在这种情况下,要使用特定的编辑器进行编辑,应该接管 GridView.CustomRowCellEditForEditing 事件。 |
当接管 GridView.CustomRowCellEdit 事件时,使用事件的 Column 和 RowHandle 参数来标识当前正在处理的单元格。 Column 参数指定了包含单元格的 列, RowHandle 参数标识了行的 句柄。
要为当前被处理的单元格提供编辑器,则把一个特定的 repository 项指派到事件的 RepositoryItem 参数。 所使用的 “repository 项”必须被添加到网格控件的内部或外部 repository。 请参阅 Repositories 和 Repository 项 主题,来获得关于 repository 技术的细节。
注意 |
---|
当视图重新计算其可视信息时,GridView.CustomRowCellEdit 事件发生。 但是,有时可能需要人工强制重新指派编辑器。 要那样处理,则调用视图的 BaseView.LayoutChanged 方法。 |
当单元格编辑器被激活时,网格控件产生 ColumnView.ShownEditor 事件。 这允许定制编辑器的设置,来实现不同的行为。 请参阅 访问活动的编辑器 小节 (在 显示和隐藏编辑器 主题中) 获知细节。
示例 1
下面的示例展示了如何接管 GridView.CustomRowCellEdit 事件来把 ComboBoxEdit、SpinEdit 和 CheckEdit 编辑器指派到单元格,这依赖于 FieldName 列的值。 假设与这些编辑器对应的“repository 项”已经在一个 repository 中。
下面的屏幕截图展示了在代码执行前、后的网格控件的外观。 为达到演示目的,ColumnView.ShowButtonMode 属性值设置为 ShowButtonModeEnum.ShowAlways。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; private void gridView1_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e) { if (e.Column.FieldName == "FieldName") return; GridView gv = sender as GridView; string fieldName = gv.GetRowCellValue(e.RowHandle, gv.Columns["FieldName"]).ToString(); switch (fieldName) { case "Population": e.RepositoryItem = repositoryItemSpinEdit1; break; case "Country": e.RepositoryItem = repositoryItemComboBox1; break; case "Capital": e.RepositoryItem = repositoryItemCheckEdit1; break; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Private Sub GridView1_CustomRowCellEdit(ByVal sender As Object, _ ByVal e As CustomRowCellEditEventArgs) _ Handles GridView1.CustomRowCellEdit If e.Column.FieldName = "FieldName" Then Return Dim Gv As GridView = sender Dim FieldName As String = Gv.GetRowCellValue(e.RowHandle, _ gv.Columns("FieldName")).ToString() Select Case (FieldName) Case "Population" e.RepositoryItem = repositoryItemSpinEdit1 Case "Country" e.RepositoryItem = repositoryItemComboBox1 Case "Capital" e.RepositoryItem = repositoryItemCheckEdit1 End Select End Sub |
示例 2
下面的示例把不同的 ComboBoxEdit 编辑器 (有不同的列表项集) 指派到 ShipCity 列的单元格。 被指派到单元格的编辑器取决于 ShipCountry 单元格取值。 假设所使用的“repository 项”已经在一个 repository 中。
下面的插图展示了在执行示例代码之前和之后的视图:
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; private void gridView1_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e) { if (e.Column.FieldName != "ShipCity") return; GridView gv = sender as GridView; string fieldValue = gv.GetRowCellValue(e.RowHandle,gv.Columns["ShipCountry"]).ToString(); switch (fieldValue) { case "France": e.RepositoryItem = repositoryItemComboBox1; break; case "USA": e.RepositoryItem = repositoryItemComboBox2; break; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Private Sub GridView1_CustomRowCellEdit(ByVal sender As Object, _ ByVal e As CustomRowCellEditEventArgs) Handles GridView1.CustomRowCellEdit If e.Column.FieldName <> "ShipCity" Then Return Dim Gv As GridView = sender Dim FieldValue As String = Gv.GetRowCellValue(e.RowHandle, _ gv.Columns("ShipCountry")).ToString() Select Case (FieldValue) Case "France" e.RepositoryItem = repositoryItemComboBox1; Case "USA" e.RepositoryItem = repositoryItemComboBox2; End Select End Sub |