C# DataGridView';s UserDeletingRow方法本身被调用了3次

C# DataGridView';s UserDeletingRow方法本身被调用了3次,c#,datagridview,C#,Datagridview,我用DataGridView创建了新的windows窗体应用程序。这是它唯一的形式。 DataGridView1_UserDeletingRow方法中的MessageBox被调用了3次。我需要理解为什么会这样。明显的问题是DataSource,因为手动将行添加到dataGridView中,方法是而不是不必要地调用了3次 我还发现如果我把这行代码 dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(DataGri

我用DataGridView创建了新的windows窗体应用程序。这是它唯一的形式。 DataGridView1_UserDeletingRow方法中的MessageBox被调用了3次。我需要理解为什么会这样。明显的问题是DataSource,因为手动将行添加到dataGridView中,方法是而不是不必要地调用了3次

我还发现如果我把这行代码

dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(DataGridView1_UserDeletingRow);
之后

dataGridView1.DataSource = dt;
一切正常,方法DataGridView1_UserDeletingRow未被调用

using System;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void DataGridView1_UserDeletingRow(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            MessageBox.Show(sender.ToString());
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(DataGridView1_UserDeletingRow);

            var dt = new DataTable("myTableName");
            dt.Columns.Add("myColumnName");
            dt.Rows.Add(new object[] { 123 });

            dataGridView1.DataSource = dt;
        }
    }
}

有人能解释一下到底发生了什么吗?

嘿,我刚才也遇到了同样的问题,我就是这样解决的:

protected override void OnUserDeletedRow(DataGridViewRowEventArgs e)
{
    base.OnUserDeletedRow(e);

    //You're code here
}
我在DataGridView函数OnUserDeletedRow上使用了覆盖,调用了基函数并添加了我想要触发的代码

此函数只触发一次并解决了我的问题,您还可以覆盖其他类似的函数,以替代侦听事件


祝你好运。

很难理解这一点,因为它涉及到
数据源=…
的内部实现(数据源的
设置器
)。如果不使用
数据源
,一切都将正常。仅在
数据源
初始化
时才会发生这种情况,在为
数据源
赋值后,您可以尝试向
数据表
(基础源)添加行并从中删除行,您将看到,
RowsAdded
RowsRemoved
将以正确的次数被激发。@King这很烦人。。。调用该方法的次数完全不可预测。我创建这个应用程序只是为了得到一些答案。在我的实际应用中,该方法被调用了2次,而不是3次,你能相信吗?实际上……不是这样,问题是我们不太了解
数据源设置器的实现,如果您设置
allowUserToAddress=false
,则触发时间将减少到2次。然而,正如我所说,只有在初始化
数据源时才会发生这种情况,您可以使用一些
标志来排除这个初始的特殊情况,然后,一切都会正常工作。@King好吧,标志确实是一个解决方案,但我认为有更好的方法。无论如何,谢谢你的帮助。@Tvde1对不起,我不懂你的意思。