GridView中启用了删除按钮,
而GridView绑定的是一张主键表数据,
因为有其它的外键表引用该主键表的ID列,
删除GridView中的信息,就会报异常,
在用GridView控件中自带的删除按钮删除数据时,
提示用户需先删除外键引用表的数据,
否则提示不让删除的信息
应该是在什么事件里,
但不知代码该如何写。请各位有经验的大虾帮忙指点一下,
该如何解决?

解决方案 »

  1.   

    这个和gridview没有关系的,
    你先把外键表中的对应主键的数据全部删除
    最后删除主键表的数据这是数据库错误,
      

  2.   

    你们还是没明白我的意思,数据库中有两个表之间是主外键关系,
    然后在页面中用GridView控件绑定主键表的数据了,
    在GridView控件中启用了删除按钮,
    单击按钮肯定会报异常,因为主外键表都有数据,
    外键表引用主键表的ID,我想在单击GridView控件上的删除按钮时,
    弹框提示用户先去删除外键表的数据,
    否则主键表的数据不允许删除。
      

  3.   

    try cactch这个异常并弹出提示!
      

  4.   

    删除事件里就可以咯,用GridView的OnRowDeleting()事件
      

  5.   

    在OnRowDeleting事件中,拿到该行的主键
    去Select子表,有数据则:Response.write("该数据已被引用,不可删除!")
    反之,则删除主档
      

  6.   

    我不想删除从表的数据,
    只是提示用户不能删除主表(GridView)的数据,
    除非没有任何从表引用的情况下。如果加try...catch语句,
    也不知该在哪里捕获异常。
      

  7.   

    你在用户点击删除的时候,判断一下,该主键是否存在约束,如果有,就弹出提示,先去删除受约束的外键表的记录,然后才能删除主键表的记录,不知道LZ是不是要这样的效果?在RowDeleting事件里写,读取该行主键值,然后遍历外键表,是否存在关联记录,有则提示,无则直接删除。
      

  8.   

    那就根据主键去Select子表有没有数据,不就可以了吗
    还是说有很多张子表引用这张主表 ?
    try{
    //执行删除 SQL 语句
    }catch{
    response.write("此数据已被引用!")
    }
      

  9.   

    我用的是启用GridView的删除按钮时,自动生成的sql删除语句,
    在RowDeleting事件里,怎么try...catch呀
      

  10.   

    这是你数据库的问题..有外键的原因.报的异常的提示不已经很清楚了吗?
    你可以在删主表记录的时候先判断一下子表有没有与之相关的数据.然后提示一下
    或者就try catch
      

  11.   

    RowDeleting事件里怎么不能try...catch啦
    把删除主档的那一段 catch 了不就行了么
      

  12.   

    怎么写呀,
    我的删除语句在页面中,
    try什么呀
      

  13.   

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                //删除操作
            }
            catch (Exception ex)
            {
                //删除失败,有引用,抛出异常
            }
        }
      

  14.   

    RowDeleting完全可以try...catch,楼主晕了吧
      

  15.   

    没有代码,代码都是在页面中通过拖拽控件自动生成的,
    删除语句也在那里面,
    当我点击GridView上自带的删除按钮时,
    它会自动执行删除操作,
    我怎么在事件里try
      

  16.   

    你就是用了SqlDataSource控件,它也会进RowDeleting事件的
      

  17.   

    我知道会过RowDeleting事件,
    可是事件里怎么处理
      

  18.   

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            DeleteData(GridView1.DataKeys[e.RowIndex].Value.ToString());
        }
        private void DeleteData(string id)
        {
            try
            {
                this.SqlDataSource1.DeleteCommand = "delete from users where id="+id.ToString();
                int i = this.SqlDataSource1.Delete();
                Response.Write(i.ToString());
                //删除操作
            }
            catch (Exception ex)
            {
                Response.Write("错误!");
                //删除失败,有引用,抛出异常
            }
        }
      

  19.   

    我试了试,虽然程序从catch块过,
    但还是会自动跳转到错误页面,
    不显示我自定义的信息。DELETE 语句与 COLUMN REFERENCE 约束 'FK__b__d__45F365D3' 冲突。
    该冲突发生于数据库 'a',表 'b', column 'c'。
    语句已终止。
      

  20.   

    晕了,自己跟踪代码
    看Catch的e得到的错误信息是什么。
    自己跟踪一下
      

  21.   

        protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            string KeyId = GridView1.DataKeys[e.RowIndex].Value.ToString();
            string DeleteStr = "DELETE FROM Suppliers WHERE SupplierID='" + KeyId + "'";
            SqlConnection DeleteCon = new SqlConnection(ConStr);
            SqlCommand DeleteCmd = new SqlCommand(DeleteStr, DeleteCon);
            try
            {
                DeleteCon.Open();
                DeleteCmd.ExecuteNonQuery();
                BindGridView();
                Literal TxtMsg = new Literal();
                TxtMsg.Text = "<script>alert('删除成功')</script>";
                Page.Controls.Add(TxtMsg);
            }
            catch (Exception ex)
            {
                Literal TxtMsg = new Literal();
                TxtMsg.Text = "<script>alert('删除出错,请检查数据是否有关联')</script>";
                Page.Controls.Add(TxtMsg);
            }
            finally
            {
                DeleteCon.Dispose();
            }
        }
      

  22.   

    你可以用模版来做啊. 放一个linkbutton 然后在他的rowcommand 事件里做删除,判断.或者在数据库中做级联删除.
      

  23.   

    先把跟你这主键有关的其它表里的数据删了。。再删这个主键的数据就OK了,跟Gridview没啥关系的。
      

  24.   

    rowdelet里写,然后就是获取删除的行的主键信息,然后删除就可以了,普通的删除信息的功能
      

  25.   

    把执行删除操作的代码
    放在try块中
    在catch中对用户提示
    然收级联删除
      

  26.   

    对于你这个问题,我的思路是
    你出现的那个问题我以前遇到过.
    1.为了不让别人看到出错信息时有坏的感觉,用
    try
    {}
    catch(Exception ex
    (
      Response.Write(ex.message
    )
    2.在Rowdeleting事件编写代码判断是否有其他的表引用了该表中的键,如果有的话不能删除,弹出提示信息.没有的话可以删除
      

  27.   

    用try...catch,上面都有N多正确答案 汗。。
      

  28.   

    在catch中
    用代码将连接指向该页,
    然后结束该页的执行,Response.End()即可。
      

  29.   

    好多人都没有理解lz的意思,我也是遇到这个问题找到这里,没有一个是正解.所以lz我们是同病相怜呀
    不过刚刚终于解决了,其实很简单:
    Protected Sub SqlDsUser_Deleted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs) Handles SqlDsUser.Deleted
            If e.AffectedRows = 0 Then                    '此处判断条件也可以e.ExceptionHandled = False
                MsgBox("此数据已被引用,不能删除!")
                                                          ' MsgBox(e.Exception.ToString)'这里可以捕捉异常
                e.ExceptionHandled = True
            End If
        End Sub
      

  30.   

    楼主把问题写的那么清楚,你们底下那些回帖的都没有认真看,回答的是很认真,但是除了SXZZ外,其他都是答非所问.
    SXZZ的方法是正确的.其他都是放屁.
    protected void gvRoom_RowDeleted(object sender, GridViewDeletedEventArgs e)
        {
            if (e.AffectedRows == 0)
            {
                lbError.Text ="该数据已经被引用,不能删除!";
                e.ExceptionHandled = true;
            }
        }