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