跳过“添加状态”直接进入“编辑状态”及DevExpress GridControl新增行问题咨询
解决方案:跳过DevExpress GridControl新增行的临时状态,直接进入编辑模式
我之前也碰到过一模一样的问题,DevExpress GridControl默认的新增行临时状态(那种按Esc会删行、无法选中的模式)确实很影响操作体验,下面是几个亲测有效的解决思路:
1. 强制新增行直接进入编辑状态,取消临时模式
处理GridView.InitNewRow事件,在新增行创建完成后,立刻将其切换到正常编辑状态,同时让行可以被选中:
private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e) { GridView view = sender as GridView; // 确保焦点锁定在新增行上 view.FocusedRowHandle = e.RowHandle; // 直接打开编辑器进入编辑状态 view.ShowEditor(); // 关闭新增行的临时"自动删除"行为 view.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.True; // 开启多选并选中当前新增行(如果需要多选功能) view.OptionsSelection.MultiSelect = true; view.SelectRow(e.RowHandle); }
另外可以提前修改GridView的全局选项,让新增行一开始就加入正式行集合:
- 打开GridView设计器,找到OptionsBehavior,设置
ImmediateUpdateRowPosition为True,这样新增行不会停留在临时位置,直接成为可选中的正常行。
2. 自定义导航器的新增按钮行为
如果嵌入式导航器的默认新增逻辑不符合需求,可以重写按钮点击事件,手动控制新增流程:
private void gridControl1_EmbeddedNavigator_ButtonClick(object sender, DevExpress.XtraEditors.NavigatorButtonClickEventArgs e) { if (e.Button.ButtonType == DevExpress.XtraEditors.NavigatorButtonType.Append) { // 取消导航器的默认新增行为 e.Handled = true; GridView view = gridControl1.MainView as GridView; // 手动添加新行并获取行句柄 int newRowHandle = view.AddNewRow(); // 聚焦新行并进入编辑状态 view.FocusedRowHandle = newRowHandle; view.ShowEditor(); // 选中该行(适配多选场景) view.SelectRow(newRowHandle); } }
3. 拦截Esc键,避免误删新增行
如果还是存在按Esc删除整行的问题,可以重写GridView的KeyDown事件,自定义Esc键的行为:
private void gridView1_KeyDown(object sender, KeyEventArgs e) { GridView view = sender as GridView; // 如果当前是新增行,按下Esc仅关闭编辑器,不删除行 if (e.KeyCode == Keys.Escape && view.IsNewItemRow(view.FocusedRowHandle)) { view.CloseEditor(); e.Handled = true; } }
4. 修改新增行的左侧指示器图标
要把默认的光标图标改成编辑表单图标,可以处理CustomDrawRowIndicator事件自定义绘制:
private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { GridView view = sender as GridView; if (e.RowHandle == view.FocusedRowHandle && view.IsNewItemRow(e.RowHandle)) { // 替换为DevExpress内置的编辑图标 e.Info.Image = DevExpress.Images.ImageResourceCache.Default.GetImage("images/actions/edit_16x16.png"); e.Info.ImageAlignment = StringAlignment.Center; e.Handled = true; } }
把这些方法组合起来,就能完美解决你遇到的所有问题:新增行直接进入编辑状态、Esc不会删除整行、支持包含新增行的多选操作,同时指示器图标也能改成你需要的样式。
内容的提问来源于stack exchange,提问作者user9730459
相关产品推荐
相关产品推荐

