You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(); 
} 

问题分析

你的代码里有两个关键问题导致删除按钮失效:

  1. 重复创建按钮编辑器:每次点击btnDown都会新建一个RepositoryItemButtonEdit并绑定到列上,这会导致多个编辑器实例重叠,事件绑定混乱,实际点击时可能触发的不是你期望的那个事件。
  2. 依赖选中行删除: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:32