GridView与ObjectDataSource配合时RowDeleted事件未触发的问题
分析GridView RowDeleted事件未触发的原因及修复方案
让我们一步步排查问题:
1. 最直接的原因:GridView未绑定RowDeleted事件处理程序
看你的GridView标记代码,缺少OnRowDeleted属性,这意味着ASP.NET不知道要调用你后台写的GridView1_RowDeleted方法。服务器控件的事件必须在标记中显式绑定,或者在后台代码中手动注册。
修复方法:
修改GridView的标记,添加OnRowDeleted属性:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1" OnRowDeleted="GridView1_RowDeleted">
2. 次要问题:DeleteMethod未返回受影响行数(影响AffectedRows的正确性)
即使事件触发了,你的DeleteEmployee方法返回void,ObjectDataSource无法获取数据库操作影响的行数,导致e.AffectedRows的值会是-1(默认值),这样你的判断条件if(e.AffectedRows > 0)永远不会成立,提示信息也不会显示。
修复方法:
修改EmployeeDataAccess中的DeleteEmployee方法,让它返回int类型的受影响行数:
public static int DeleteEmployee(int Original_ID, string Original_Name, string Original_Education) { string cs = ConfigurationManager.ConnectionStrings["Sample"].ConnectionString; using (SqlConnection con = new SqlConnection(cs)) { con.Open(); SqlCommand cmd = new SqlCommand() { CommandText = "delete from Employee where ID = @Original_ID and Name = @Original_Name and EducationID = (select EduID from Education where EducationType = @Original_Education)", Connection = con }; SqlParameter OginalID = new SqlParameter("@Original_ID", Original_ID); cmd.Parameters.Add(OginalID); SqlParameter OginalName = new SqlParameter("@Original_Name", Original_Name); cmd.Parameters.Add(OginalName); SqlParameter OginalEducation = new SqlParameter("@Original_Education", Original_Education); cmd.Parameters.Add(OginalEducation); // 返回ExecuteNonQuery的结果(受影响的行数) return cmd.ExecuteNonQuery(); } }
额外检查点
如果做完上面两步事件还是没触发,检查页面的AutoEventWireup属性是否为true(默认是true):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="YourPage.aspx.cs" Inherits="YourNamespace.YourPage" %>
如果AutoEventWireup是false,你需要在后台的Page_Load方法中手动绑定事件:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridView1.RowDeleted += GridView1_RowDeleted; } }
按照上面的步骤修改后,RowDeleted事件应该能正常触发,并且正确显示删除提示。
内容的提问来源于stack exchange,提问作者Mina shaker
相关产品推荐
相关产品推荐

