如何通过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
相关产品推荐
相关产品推荐

