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

如何通过OnRowDeleting事件删除绑定List<T>数据源的GridView行

ASP.NET Web Forms GridView绑定List实现行删除方案

因为你用的是内存集合List<T>作为数据源,没有用数据源控件,核心要解决回发时数据源丢失、精准定位待删除行两个问题,按下面步骤实现即可:


第一步:配置GridView基础属性

首先确保你的GridView标签配置了两个必要属性:

  • 设置DataKeyNames为你实体类的唯一标识字段(比如主键Id),用来精准定位待删除行,避免索引错位删错数据
  • 确认开启删除触发入口:要么设AutoGenerateDeleteButton="true"自动生成删除按钮,要么在模板列加自定义按钮时设置CommandName="Delete"

示例前台代码:

<asp:GridView ID="Gridview" runat="server" 
              DataKeyNames="Id" 
              OnRowDeleting="Grid_RowDeleting"
              AutoGenerateDeleteButton="true">
</asp:GridView>

第二步:持久化存储数据源,避免回发丢失

Web Forms是无状态模型,页面回发时页面类的临时变量会被重置,所以需要把List<T>数据源存在ViewState(数据量小优先用)或者Session里,用属性包装方便读写:

// 替换成你自己的实体类名
private List<YourEntity> GridDataList
{
    get
    {
        if (ViewState["GridDataList"] == null)
        {
            // 这里写你首次加载数据的逻辑,比如从数据库查询得到初始List
            ViewState["GridDataList"] = GetInitDataFromDb();
        }
        return (List<YourEntity>)ViewState["GridDataList"];
    }
    set
    {
        ViewState["GridDataList"] = value;
    }
}

页面首次加载时做第一次绑定,必须加!IsPostBack判断,防止回发时覆盖修改后的数据源:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Gridview.DataSource = GridDataList;
        Gridview.DataBind();
    }
}

第三步:补全RowDeleting事件逻辑

删除逻辑分四步:取待删行主键 -> 从数据源移除对应项 -> 持久化更新后的数据源 -> 重新绑定GridView

protected void Grid_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    // 1. 取当前行的主键值,类型和你实体主键类型匹配即可
    var deleteId = (int)Gridview.DataKeys[e.RowIndex].Value;

    // 2. 从集合中找到匹配项移除
    var deleteItem = GridDataList.FirstOrDefault(x => x.Id == deleteId);
    if (deleteItem != null)
    {
        GridDataList.Remove(deleteItem);
        // 如果需要把删除同步到数据库持久化,在这里加数据库删除逻辑即可
        // 例:dbService.DeleteEntity(deleteId);
    }

    // 3. 重新绑定控件展示更新后的数据
    Gridview.DataSource = GridDataList;
    Gridview.DataBind();
}

常见踩坑点

  • 没设DataKeyNames直接拿行索引删,当GridView有分页、排序时会出现索引错位,删错数据
  • 首次绑定没加!IsPostBack判断,每次回发都重新加载初始数据,删除操作不生效
  • 自定义删除按钮没设CommandName="Delete",点击后不会触发RowDeleting事件
  • 把List存在页面类的普通变量里,回发时变量重置为null,运行报空引用错误

内容的提问来源于stack exchange,提问作者cr7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.20 16:15:49