本主题包含了关于如何及何时以程序方式调用和隐藏单元格编辑器,以及如何访问活动单元格及其取值的信息。 如果需要促进快速数据输入,则程序化编辑器控件是有用的。 例如,当应用程序启动时,可以为特定单元格显示编辑器,这样最终用户可以马上开始输入。 或者可以在运行时刻导航到特定的单元格并激活它的编辑器,来帮助最终用户仅在特殊的数据单元格间导航。
要获得关于最终用户如何调用数据单元格的编辑器的信息,请参阅 最终用户功能: 数据编辑 和 最终用户功能: 在行和单元格内导航 主题。
本主题中的信息分成三部分:
最终用户可以在什么时候编辑数据单元格
如果满足下列条件,则单元格编辑器可以被显示:
- 启用了 ColumnViewOptionsBehavior.Editable 选项。 可以通过 ColumnView.OptionsBehavior 属性访问此选项。
- 禁用了列的 OptionsColumn.ReadOnly 选项。
- 禁用了列的 OptionsColumn.AllowEdit 选项。
- ColumnView.ShowingEditor 事件处理程序 (如果已指派) 没有把它的 Cancel 参数设置为 true。
我们详细考虑最后一个条件。 每次当单元格编辑器正要被显示时,ColumnView.ShowingEditor 事件发生。 这意味着被显示单元格获得了焦点。 这样,可以使用 ColumnView.FocusedRowHandle 和 ColumnView.FocusedColumn 属性来标识它。 在确定了单元格时,就可以使用事件的 Cancel 参数来允许显示或禁止显示单元格的编辑器。 如果此参数被设置为 true,则不显示此编辑器。
下面的 ColumnView.ShowingEditor 事件处理程序禁止编辑 Country 字段值是“Germany”的记录 (ColumnView.GetRowCellValue 方法用于获取有焦点记录的 Country 列的取值)。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; // ... private void gridView1_ShowingEditor(object sender, System.ComponentModel.CancelEventArgs e) { GridView View = sender as GridView; string cellValue = View.GetRowCellValue(gridView1.FocusedRowHandle, colCountry).ToString(); if (cellValue == "Germany") e.Cancel = true; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid ' ... Private Sub GridView1_ShowingEditor(ByVal sender As Object, _ ByVal e As System.ComponentModel.CancelEventArgs) _ Handles GridView1_ShowingEditor Dim View As GridView = sender Dim CellValue As String = View.GetRowCellValue(GridView1.FocusedRowHandle, colCountry).ToString() If CellValue = "Germany" Then e.Cancel = True End Sub |
显示和隐藏编辑器
获得焦点的单元格的编辑器可以通过 BaseView.ShowEditor 方法进行调用。 这样,如果需要编辑特定的单元格,则首先必须为它设置焦点。 请参阅 为单元格设置焦点 和 在行间移动焦点 主题来获得关于设置单元格焦点的细节。
如果需要以程序方式关闭编辑器,则选择下列两种可用的方法之一:
- BaseView.CloseEditor —— 隐藏编辑器,保存所作出的更改。
- BaseView.HideEditor —— 隐藏编辑器,放弃所作出的更改。
注意,也可以使用网格控件的 BaseView.PostEditor 方法来保存更改,而不关闭编辑器。
XtraGrid 控件也允许每次当编辑器被最终用户或被程序化激活、关闭时执行操作。 可以通过分别接管 ColumnView.ShownEditor 和 ColumnView.HiddenEditor 事件来实现操作。 第一个事件可以用于帮助使用编辑器。 例如,当使用 MemoExEdit 编辑器时,在激活编辑器时可以打开其弹出窗口 (请参阅本主题下一小节的示例)。 举例来说,当需要导航到某个单元格并激活它的编辑器时,可以使用 ColumnView.HiddenEditor 事件。 下面的示例代码接管了此事件来导航到下一条记录,并激活位于获得焦点的行中单元格的编辑器。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; // ... private void gridView1_HiddenEditor(object sender, System.EventArgs e) { GridView View = sender as GridView; if (view.FocusedRowHandle == View.RowCount - 1) View.FocusedRowHandle = 0; else View.FocusedRowHandle++; View.ShowEditor(); } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid ' ... Private Sub GridView1_HiddenEditor(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles GridView1.HiddenEditor Dim View As GridView = sender If View.FocusedRowHandle = View.RowCount - 1 Then View.FocusedRowHandle = 0 Else View.FocusedRowHandle += 1 End If View.ShowEditor() End Sub |
访问活动的编辑器
在单元格编辑器活动时,可以使用控件的 ColumnView.ActiveEditor 属性来访问它。 该属性返回一个 BaseEdit 对象 (XtraEditors 库中所有编辑器的公共祖先)。 因此,需要把它转换为适当的类型,来使用特定编辑器的属性。 注意,如果当前没有活动编辑器,则该属性返回 null (在 Visual Basic 中为 Nothing )。
当视图的数据源被外部修改 (例如,如果有几个用户在使用同一个数据库),则 ColumnView.RefreshEditor 方法使用相应的单元格内容来同步活动单元格的内容。
使用活动的编辑器,可以获取和修改正在编辑的单元格取值。 通过使用 ColumnView.EditingValue 属性来实现此任务。 当没有编辑时,该属性也返回 null (在 Visual Basic 中为 Nothing)。
这些属性允许根据需要定制编辑器及被编辑的取值。 例如,下面的示例代码接管了 ColumnView.ShownEditor 事件来打开 DateEdit 编辑器的弹出窗口,并把当前的日期写入编辑文本。 当“ OrderDate”列 (必须为它绑定 DateEdit 编辑器) 的编辑器被打开时,执行此操作。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraEditors; // ... private void gridView1_ShownEditor(object sender, System.EventArgs e) { GridView View = sender as GridView; if (view.FocusedColumn == colOrderDate) { // adding the current date View.EditingValue = DateTime.Today; // obtaining the active editor DateEdit editor = View.ActiveEditor as DateEdit; // invoking the editor's popup window editor.ShowPopup(); } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraEditors ' ... Private Sub gridView1_ShownEditor(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles gridView1_ShownEditor Dim View As GridView = sender If View.FocusedColumn Is colOrderDate Then ' adding the current date View.EditingValue = DateTime.Today ' obtaining the active editor Dim Editor As DateEdit = View.ActiveEditor ' invoking the editor's popup window Editor.ShowPopup() End If End Sub |