1

我有以下代码加载我的 Windows 窗体:

    private void Panou_Load(object sender, EventArgs e)
    {
        List<string>[] list;

        list = Conexiune.Select();
        dataGridView1.Rows.Clear();

        (dataGridView1.Columns[3] as DataGridViewComboBoxColumn).DataSource = new List<string> { "", "activ", "inactiv", "neverificat", "blocat" };

        for (int i = 0; i < list[0].Count; i++)
        {
            int number = dataGridView1.Rows.Add();
            dataGridView1.Rows[number].Cells[0].Value = list[0][i];
            dataGridView1.Rows[number].Cells[1].Value = list[1][i];
            dataGridView1.Rows[number].Cells[2].Value = list[2][i];
            dataGridView1.Rows[number].Cells[3].Value = list[3][i];
            dataGridView1.Rows[number].Cells[4].Value = list[4][i];
            dataGridView1.Rows[number].Cells[5].Value = list[5][i];
            dataGridView1.Rows[number].Cells[6].Value = list[6][i];
        }
    }

一切正常,但现在我想在删除一行时在数据库中进行一些更新,所以我使用:dataGridView1_RowsRemoved

例子:

private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
    MessageBox.Show("deleted");
}
  1. 为什么表单加载时显示“已删除”消息?

  2. dataGridView1.Rows[number].Cells[0].Value包含来自数据库的 id。如何在dataGridView1_RowsRemoved函数中检索此 id?

4

1 回答 1

2

数据源(您的列表)的实际绑定DataGridView发生在表单加载事件之后,因此在数据绑定过程中会触发许多您不希望被触发的事件。

我不知道这是为什么 - 需要深入研究代码或DataGridView组件本身,但幸运的是有一个解决方法 - 在事件的事件处理程序期间附加所有此类事件DataBindingComplete

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(dataGridView1_RowsRemoved);        
}

这样您就不会RowsRemoved在表单加载时看到触发。


在您的情况下更好的是,问题第二部分的答案涉及使用不同的事件,该事件的行为符合预期,即使在DataBindingComplete.

问题RowsRemoved在于它在删除行后触发,因此即使您从事件参数中获得了该行的(旧)索引,获取数据也非常棘手(也许不可能?)

解决方法是改为处理UserDeletingRow事件:

void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    var msg = e.Row.Cells[0].Value.ToString();

    MessageBox.Show(msg);
} 

对于删除的每一行,都会触发一次此事件 - 聚合这些事件然后从处理程序中执行单个数据库操作可能是有意义的RowsRemoved

于 2013-11-13T23:00:42.847 回答