防止数据表.ColumnChanged从递归触发

本文关键字:递归 ColumnChanged 数据表 | 更新日期: 2023-09-27 18:07:56

我在DataGridView中有三列,用户可以输入时间、开始和结束的任何组合。只要改变其中任何一个,就计算另外两个。

我的想法是使用DataTable。ColumnChanged事件处理程序。不出所料,在ColumnChanged处理程序中计算值会导致事件处理程序再次触发,并以无限循环结束。

我尝试了各种设置标志和临时删除事件处理程序的方法,但无论我做什么,事件继续反复触发。

谁能提供关于如何确保事件仅在第一次更改时触发,或者不处理相同的代码(并随后导致事件再次触发)的想法?

多谢马特

防止数据表.ColumnChanged从递归触发

我试过你的方法,效果很好。下面是代码:

DataTable dt;
bool SilenceMode;
private void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();
    dt.Columns.Add("A");
    dt.Columns.Add("B");
    dt.ColumnChanged += ColChange;
    dataGridView1.DataSource = dt;
}

void ColChange(object sender, DataColumnChangeEventArgs e )
{
    if (!SilenceMode)
    {
        SilenceMode = true;
        //******************
        //Here edit DataTable Without infinity loop
        string colNameToChange = e.Column.ColumnName == "A" ? "B" : "A";
        e.Row[colNameToChange] = e.ProposedValue;
        //******************
        SilenceMode = false;
    }
}

但我认为这是更好的实现它在UI(事件的DataGridView)。