dataGridView1_RowsRemoved无法正常工作

时间:2013-11-13 22:21:32

标签: c# datagridview

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

    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?

1 个答案:

答案 0 :(得分:2)

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

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

DataBindingComplete

这样你就不会在表单加载时看到void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(dataGridView1_RowsRemoved); } 了。


在您的情况下更好,问题第二部分的答案涉及使用不同的事件,即使在RowsRemoved期间没有附加时也会按预期行事。

DataBindingComplete的问题是它在删除行后触发,所以即使你有事件args中行的(旧)索引,获取数据也非常棘手(可能不可能) ?)

修复方法是处理RowsRemoved事件:

UserDeletingRow

对于每个被删除的行都会触发一次此事件 - 聚合这些事件然后从void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { var msg = e.Row.Cells[0].Value.ToString(); MessageBox.Show(msg); } 处理程序中执行单个数据库操作可能是有意义的。