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