如何暂时禁用事件

时间:2014-12-28 15:07:25

标签: c# winforms validation events

我有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;
}

但它不会工作,我知道为什么,但我不知道如何解决这个问题 谢谢你的时间,对我的英语感到抱歉

1 个答案:

答案 0 :(得分:0)

这是因为单元格在您离开时为了单击删除按钮而在单击发生之前进行验证。因此,在click事件处理程序中分离事件将不起作用。

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

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