【问题标题】:DataGridView's UserDeletingRow method is called 3 times by itselfDataGridView的UserDeletingRow方法被自己调用了3次
【发布时间】:2013-09-14 20:15:11
【问题描述】:

我用 DataGridView 创建了新的窗体应用程序。这是它唯一的形式。 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;
        }
    }
}

谁能解释一下到底发生了什么?

【问题讨论】:

  • 这很难理解,因为它涉及到DataSource = ...DataSourcesetter)的内部实现。如果你不使用DataSource,一切都会正常。它仅发生在DataSourceinitialization 上,在分配DataSource 之后,您可以尝试在DataTable(底层源)中添加行和删除行,您将看到RowsAdded 和@ 987654333@ 将以正确的次数被触发。
  • @King 很烦...方法被调用的次数是完全无法预测的。我创建这个应用程序只是为了得到一些答案。在我的实际应用中,该方法被调用了 2 次,而不是 3 次,你相信吗? srsly...
  • 不是真的,问题是我们不太了解DataSource setter的实现,如果你设置AllowUserToAddRows = false,触发次数会减少到2。但是正如我所说,只有在初始化 DataSource 时才会发生这种情况,您可以使用一些 flag 来排除这种初始特殊情况,然后一切都会正常。
  • @King 好吧,flag 确实是一个解决方案,但我认为有更好的方法。无论如何,感谢您的帮助。

标签: c# datagridview


【解决方案1】:

嘿,我刚刚遇到了同样的问题,这就是我解决它的方法:

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

    //You're code here
}

我在 DataGridView 函数 OnUserDeletedRow 上使用了 override,调用了基本函数并添加了我想要触发的代码。

这个函数只触发一次就解决了我的问题,你也可以像这样覆盖其他函数来代替监听事件。

祝你好运。

【讨论】:

  • @Tvde1 对不起,我不明白你的意思。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多