填充时如何停止CellValueChanged触发?

时间:2014-08-18 08:19:46

标签: c# vb.net datagridview

我有一个包含多个DataGridView的表单。在程序运行时,它们将以编程方式清除和填充。这是基于用户在表单中在其中一个DataGridView中更改的单元格。用户更改单元格会触发清除和重新填充所有DataGridViews,包括与之交互的DataGridView。

现在问我的问题。每次DataGridViews被清除并以编程方式重新填充时,我是否可以避免触发CellValueChanged?相反,它只应在用户编辑表单中的单元格时触发。

我试图寻找答案但没有成功,所以我希望这不是一个重复的问题。

2 个答案:

答案 0 :(得分:7)

我怀疑你可以阻止CellValueChanged事件被触发,除了删除你的处理程序(事件仍将被触发,但不会有任何处理程序):

private dgv_ThatCausesChanges_CellValueChanged(object sender, EventArgs e)
{        
    this.otherDGV.CellValueChanged -= this.dgv_OtherDGVCellValueChanged;

    try // To make sure that handlers are reinstatiated even on exception thanks @Steve
    {       

         // Change other DGVs
    }
    finally
    {    
         this.otherDGV.CellValueChanged += this.dgv_OtherDGVCellValueChanged;
    }
}

或者作为替代解决方案,只需添加一些标记,将在每个处理程序中进行检查:

private bool IsChanging;

private dgv_ThatCausesChanges_CellValueChanged(object sender, EventArgs e)
{
    this.IsChanging = true;

    try // To make sure that handlers are reinstatiated even on exception thanks @Steve
    {  

        // Change other DGVs
    }
    finally
    {    
        this.IsCHanging = false;
    }
}

private dgv_OtherDGVCellValueChanged(object sender, EventArgs e)
{
    if (this.IsChanging)
        return;

    // Handle changes
}

答案 1 :(得分:2)

感谢@Eugene和@Steve我已经找到了解决方案。我有在我的GUI类中调用更新方法的模型类。当调用这些更新方法时,我删除事件处理程序,以便清除和刷新DataGridView不会导致多次调用CellValueChanged,如下所示:

public void updateSomeDataGridView(String[][] someData)
{
    this.dataGridView1.CellValueChanged -= this.DataGridView1_CellValueChanged;
    dataGridView1.Rows.Clear();

    //Repopulate DataGridView with new data.

    dataGridView1.Refresh();
    this.dataGridView1.CellValueChanged += this.DataGridView1_CellValueChanged;
}