Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止DataTable.ColumnChanged递归触发_C#_Datagridview - Fatal编程技术网

C# 防止DataTable.ColumnChanged递归触发

C# 防止DataTable.ColumnChanged递归触发,c#,datagridview,C#,Datagridview,我在DataGridView中有三列,用户可以输入时间、开始和结束的任意组合。更改其中任何一项后,将计算其他两项 我的想法是使用DataTable.ColumnChanged事件处理程序。毫不奇怪,计算ColumnChanged处理程序中的值会导致事件处理程序再次启动并最终进入无限循环 我尝试了各种设置标志和临时删除事件处理程序的方法,但无论我做什么,事件都会继续反复触发 有人能提供一些想法,如何确保事件只在第一次更改时触发,或者不处理相同的代码(随后导致事件再次触发) 非常感谢 马特我试过你的

我在DataGridView中有三列,用户可以输入时间、开始和结束的任意组合。更改其中任何一项后,将计算其他两项

我的想法是使用DataTable.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的事件)中实现它