从循环中停止多个事件

时间:2011-08-05 13:44:14

标签: c# events

我有一个功能,旨在让我的用户将一组对象(机场)移动到一个新位置。

在对话框上,我有四个控件 - 两个表示坐标的文本框和两个用于距离的数字向上,一个用于轴承。用户可以选择输入距离和方位或一组坐标。这是通过复选框完成的,未使用的设置被禁用。因此用户有反馈我希望在用户输入启用的对时更新禁用的对值。如果他们输入坐标,则距离和轴承更新,反之亦然。

我这样做的方法是响应每个对象的TextChanged事件来更新其他对象。当然,当另一个控件更新时,这会创建一个事件触发另一个事件并再次返回。据我所知,它并没有创建无限循环,但它确实搞乱了活动框中的插入位置。

我尝试了一些方法,包括尝试根据哪些框处于活动状态或使用某些bool标记来禁用事件。我也尝试使用计时器而不是事件。这一切都非常混乱,似乎没有办法。我想知道是否有更好的方法。

由于

2 个答案:

答案 0 :(得分:1)

假设您使用的是Windows窗体:

// this.ckPosition.CheckedChanged += new System.EventHandler(this.ckPosition_CheckedChanged);
private void ckPosition_CheckedChanged(object sender, EventArgs e)
{
  txtX.Enabled = txtY.Enabled = ckPosition.Checked;
  numBearing.Enabled = numDistance.Enabled = !ckPosition.Checked;
}

// this.txtX.TextChanged += new System.EventHandler(this.Position_TextChanged);
// this.txtY.TextChanged += new System.EventHandler(this.Position_TextChanged);
private void Position_TextChanged(object sender, EventArgs e)
{
  if (ckPosition.Checked)
  {
    // Replace with your calculations
    numBearing.Value = Convert.ToInt32(txtX.Text);
    numDistance.Value = Convert.ToInt32(txtY.Text);
  }
}

// this.numBearing.ValueChanged += new System.EventHandler(this.BearingDistance_ValueChanged);
// this.numDistance.ValueChanged += new System.EventHandler(this.BearingDistance_ValueChanged);
private void BearingDistance_ValueChanged(object sender, EventArgs e)
{
  if (ckPosition.Checked == false)
  {
    // Replace with your calculations
    txtX.Text = numBearing.Value.ToString();
    txtY.Text = numDistance.Value.ToString();
  }
}

只要您不改变位置事件处理程序中的位置或其处理程序中的方位/距离,就不应该有任何“循环”事件。

答案 1 :(得分:0)

我知道这可能是一个非常大的表现,但你是否尝试使用反射来判断事件的来源是否是转发事件?你可以进一步查看堆栈以查明事件是否是转发事件,或者如果调用堆栈深度变得荒谬,你可以中止。 或者,如果您手动调用TextChanged事件,则可以从eventArgs类派生以传递您自己的自定义eventArgs,然后在eventArgs是您的自定义类型时中止,或者使用自定义eventArgs传递状态信息来帮助您。 或者也许您可以使用您自己的类似事件处理程序交换控件上的TextChanged事件。