C# 如何在填充时停止发射?

C# 如何在填充时停止发射?,c#,vb.net,datagridview,C#,Vb.net,Datagridview,我有一个包含多个DataGridView的表单。当程序运行时,它们将以编程方式被清除和填充。这是基于用户在表单中更改其中一个DataGridView中的单元格。用户更改单元格会触发清除和重新填充所有DataGridView,包括与之交互的DataGridView 现在来回答我的问题。是否可以避免每次以编程方式清除和重新填充DataGridView时触发CellValueChanged?相反,它应该仅在用户编辑表单中的单元格时触发 我尝试搜索答案,但没有成功,因此我希望这不是一个重复的问题。除了删

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

现在来回答我的问题。是否可以避免每次以编程方式清除和重新填充DataGridView时触发CellValueChanged?相反,它应该仅在用户编辑表单中的单元格时触发


我尝试搜索答案,但没有成功,因此我希望这不是一个重复的问题。

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

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

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
}

多亏了尤金和史蒂夫,我找到了解决办法。我的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;
}

事件处理程序可以通过编程方式添加和删除。因此,您建议@Steve在我清除并重新填充DataGridView时删除事件处理程序,然后再次添加,这样它只捕获用户事件?是的,下面的答案说明了如何做。请记住在加载代码时使用try/finally来重新安装处理程序,以防出现异常(除非异常严重到您选择终止程序),我认为添加和删除事件处理程序比引入全局变量要好。在任何情况下,try/finally在本规范中都是强制性的situations@Steve添加和删除处理程序可减少对其他DGV的依赖,但使源DGV负责记住应更改的DGV,而表单级别变量可简化源DGV的使用寿命,但使依赖DGV负责正确处理状态。因此,这只是权衡和偏好的问题。删除处理程序的Try-catch块是一个必要的总体实践,但静态UI是否需要它们是另一个问题——在这种情况下,它们可能只是隐藏bug。正如您所说,这是一个偏好问题。我的目标是不惜一切代价避免全局变量,在这种基本情况下也是如此。对于try/finally,我只记得(如果异常不是死停止),事件处理程序或全局变量应该在finally中还原为正确的值block@Steve我最后添加了块。表单级别的变量不比表单事件更全局。您给我一个解决方案来结束nightmate,谢谢
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;
}