我有以下代码加载我的窗体:
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");
}
为什么在表单加载时会显示“已删除”消息?
dataGridView1.Rows[number].Cells[0].Value
包含数据库中的id。我如何在dataGridView1_RowsRemoved
函数中检索此ID?
答案 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);
}
处理程序中执行单个数据库操作可能是有意义的。