如何暂时禁用事件

本文关键字:事件 何暂时 | 更新日期: 2023-09-27 18:35:24

我有具有单元格验证事件的datagridview,因此用户必须在离开该单元格之前填充列[0]上的单元格

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(dataGridView1.CurrentRow.Cells[0].FormattedValue.ToString()))
        {
            MessageBox.Show("Please fill this field");
            e.Cancel = true;
        }
    }

我想删除带有按钮的行,即使该行上的所有单元格都为空,但每次单击DeleteRow_btn验证消息时都会显示

private void DeleteRow_btn_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
            if (dataGridView1.Rows.Count < 1)
            {
                dataGridView1.Rows.Add();
            }
        }

我已经尝试过了

private void DeleteRow_btn_Click(object sender, EventArgs e)
{
        dataGridView1.CellValidating -= dataGridView1_CellValidating;
        dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
        if (dataGridView1.Rows.Count < 1)
        {
            dataGridView1.Rows.Add();
        }
        dataGridView1.CellValidating += dataGridView1_CellValidating;
}

但它行不通,我知道为什么,但我不知道如何解决这个问题谢谢你的时间,无论如何对不起我的英语

如何暂时禁用事件

这是因为当您

离开单元格以单击删除按钮时,但在单击发生之前,该单元格正在进行验证。因此,在 click 事件处理程序中分离事件将不起作用。

解决方案是仅在行不为空时才显示验证消息。 即,如果所有单元格都为空,则不应显示验证消息。

bool isRowEmpty = dataGridView1.CurrentRow.Cells
    .Cast<Cell>()
    .All(cell => IsNullOrWhiteSpace(cell.FormattedValue.ToString()));
if (isRowEmpty) {
    // validate
}