C# 等于重写被无故调用

C# 等于重写被无故调用,c#,events,datagridview,overriding,C#,Events,Datagridview,Overriding,我有下面几段代码。出于某种原因,当触发“CellMouseDown”事件时,它似乎会对网格中的每一行调用“Equals”方法两次 我最近做了一系列的改变,显然其中一个改变导致了这种情况,但在这一点上,我没有办法放弃这些改变 问题是,我得到了一个无效的强制转换异常,因为此时“obj”不是“DataSource”类型(如果不触发它也没关系,它不应该是) 有谁能想出当“CellMouseDown”开火(而且发生了很多次)时“Equals”被呼叫的原因吗 谢谢 安德鲁 private void

我有下面几段代码。出于某种原因,当触发“CellMouseDown”事件时,它似乎会对网格中的每一行调用“Equals”方法两次

我最近做了一系列的改变,显然其中一个改变导致了这种情况,但在这一点上,我没有办法放弃这些改变

问题是,我得到了一个无效的强制转换异常,因为此时“obj”不是“DataSource”类型(如果不触发它也没关系,它不应该是)

有谁能想出当“CellMouseDown”开火(而且发生了很多次)时“Equals”被呼叫的原因吗

谢谢

安德鲁

    private void gridDataSources_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        // this is so I can select the current row when you right-click to change the color
        if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
        {
            this.gridDataSources.Rows[e.RowIndex].Selected = true;
            this.gridDataSources.CurrentCell = this.gridDataSources.Rows[e.RowIndex].Cells[e.ColumnIndex];
        }
    }

    public override bool Equals(object obj)
    {
        DataSource original = (DataSource)obj;

        // code removed for brevity

        return true;
    }

显然,Equin BindingListView在内部使用对象的“Equals”方法。现在我不确定为什么这以前从来都不是问题,因为问题是我的编码不好,一直都是这样(不是我提到的变化之一)。原来我在自定义类上重写了“Equals”方法,但实际上我在比较两种不同的对象类型。一个是我的自定义类(模型),另一个是实际的实体。我将它们相互比较,以确定是否需要编写历史记录条目(或者甚至保存任何内容,因为如果它没有什么不同,那么为什么要麻烦),但我将苹果与橙子进行比较,这实际上不是在覆盖“Equals”方法时应该做的事情。

那么,为什么不查看堆栈跟踪呢?这会给你一个很好的提示,告诉你发生了什么。但从根本上说,您的实现是失败的,因为当给定一个非数据源时,它应该只返回
false
。从文档中可以看出:“Equals的实现不能抛出异常;它们应该总是返回一个值。”首先,堆栈跟踪没有给我任何细节。我不知道为什么,但在那之前好像什么都没叫过。另外,如果我在“Equals”周围放置try/catch,那么我得到:Position要么小于0,要么大于数据源中的项数。行上:this.gridDataSources.CurrentCell=this.gridDataSources.Rows[e.RowIndex].Cells[e.ColumnIndex];这对我来说也毫无意义(您是否在单击新行(底部带有*)单元格?否,是现有行。网格数据是否绑定?数据源的类型是什么(即列表、绑定列表等)?