DevExpress WinForms GridControl删除按钮无法删除选中行求助
解决DevExpress GridControl删除按钮无法删除行的问题
我来帮你排查这个删除按钮失效的问题,咱们一步步来分析和解决:
首先先梳理下你的现有代码:
添加行和删除按钮的代码
private void btnDown_Click(object sender, EventArgs e) { DataRow r = dt.NewRow(); r[0] = cmbProject.Text; r[1] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Le Nom").ToString(); r[2] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Quantité Restante"); r[3] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Longueur"); dt.Rows.Add(r); deleteButton = new RepositoryItemButtonEdit(); deleteButton.Buttons[0].Kind = ButtonPredefines.Delete; GridColumn column = gridView2.Columns["Projet"]; column.ColumnEdit = deleteButton; column.ShowButtonMode = ShowButtonModeEnum.ShowAlways; deleteButton.ButtonClick += btnDelete_Click; }
删除按钮点击事件
private void btnDelete_Click(object sender, EventArgs e) { gridView2.DeleteSelectedRows(); }
问题分析
你的代码里有两个关键问题导致删除按钮失效:
- 重复创建按钮编辑器:每次点击
btnDown都会新建一个RepositoryItemButtonEdit并绑定到列上,这会导致多个编辑器实例重叠,事件绑定混乱,实际点击时可能触发的不是你期望的那个事件。 - 依赖选中行删除:
DeleteSelectedRows()只会删除已经被选中的行,但点击按钮时,当前行可能并没有被选中(比如用户直接点按钮没选行),所以这时候调用这个方法就不会有任何效果。
解决方案
第一步:优化按钮编辑器的创建逻辑
把按钮编辑器的初始化移到窗体加载时,只创建一次,避免重复绑定:
首先在窗体类里声明成员变量:
private RepositoryItemButtonEdit deleteButton;
然后在窗体的Load事件里初始化按钮:
private void Form_Load(object sender, EventArgs e) { // 初始化删除按钮编辑器 deleteButton = new RepositoryItemButtonEdit(); deleteButton.Buttons[0].Kind = ButtonPredefines.Delete; deleteButton.ButtonClick += btnDelete_Click; // 绑定到gridView2的Projet列 GridColumn projectColumn = gridView2.Columns["Projet"]; if (projectColumn != null) { projectColumn.ColumnEdit = deleteButton; projectColumn.ShowButtonMode = ShowButtonModeEnum.ShowAlways; } }
然后修改btnDown_Click,只保留添加行的逻辑:
private void btnDown_Click(object sender, EventArgs e) { DataRow r = dt.NewRow(); r[0] = cmbProject.Text; r[1] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Le Nom").ToString(); r[2] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Quantité Restante"); r[3] = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "Longueur"); dt.Rows.Add(r); }
第二步:修改删除事件,直接删除按钮所在行
把删除逻辑改成直接获取按钮所在的当前行,不需要依赖选中状态:
private void btnDelete_Click(object sender, EventArgs e) { ButtonEdit clickedButton = sender as ButtonEdit; if (clickedButton == null) return; // 获取当前按钮所在的GridView GridView targetView = gridView2; // 获取当前按钮对应的行句柄(按钮点击时焦点会自动移到当前行) int rowHandle = targetView.FocusedRowHandle; // 检查行句柄是否有效,避免索引越界 if (targetView.IsValidRowHandle(rowHandle)) { targetView.DeleteRow(rowHandle); // 如果需要确认数据源提交,可以加上这句 // dt.AcceptChanges(); } }
第三步:额外检查项
如果修改后还是不行,检查这两个配置:
- 确保
gridView2.OptionsBehavior.AllowDeleteRows属性设置为true(默认是true,但可能被误改) - 检查数据源
dt(DataTable)是否有只读约束,或者是否绑定了不允许删除的数据源 - 确认没有在
gridView2.RowDeleting事件里取消删除操作(比如设置e.Cancel = true)
内容的提问来源于stack exchange,提问作者M.Bouabdallah
相关产品推荐
相关产品推荐

