几个EventHandlers / delegate块 - 如何停止处理?

时间:2011-02-01 09:36:04

标签: c# event-handling

我有关于事件处理的概念性问题。

让分配给一个事件的几个匿名委托块。基本上,onedelegate会进行检查,如果检查失败,最终应该停止处理后面的块。

我知道可以将所有内容放入一个委托块中,并在需要时返回。

但是,当需要对多个对象进行检查时,代码必须在每个对象上。

object1.SomeEvent += delegate {
  // check something
  if (somethingHappened) {
    // STOP!
    return;
  }
  // do something for object1 (if nothing happened)
}

object2.SomeEvent += delegate {
  // check something
  if (somethingHappened) {
    // STOP!
    return;
  }
  // do something else for object2 (if nothing happened)
}

有可能做这样的事吗?如果是的话,该怎么做?

EventHandler checkSomething = delegate {
  if (somethingHappened) {
    // STOP!
    // What to do here?
    return; // This won't prevent the other event handlers from executing. :(
  }
};

object1.SomeEvent += checkSomething;
object1.SomeEvent += delegate {
  // do something for object1 (if nothing happened)
};

object2.SomeEvent += checkSomething;
object2.SomeEvent += delegate {
  // do something else for object2 (if nothing happened)
}

修改
实际情况:

对象属于UIButton(MonoTouch / UIKit)类型,只要用户停止点击它们(在其框架内),就会收到事件TouchUpInside。

有一个错误情况应该阻止两个按钮做他们通常做的事情,而是显示一个UIAlertView警告用户有关错误情况。

3 个答案:

答案 0 :(得分:1)

如果您拥有object1和object1的类,则可以自己完成事件的调用列表(而不是简单地调用事件)。

但它会变得非常混乱。考虑替代设计,例如将其拆分为2个事件(1进行检查)。

答案 1 :(得分:0)

如果以下事件处理程序应停止处理,只需使用CancelEventArgs并将取消设置为true

EventHandler checkSomething = delegate {
  if (somethingHappened) {
    // STOP!
    e.Cancel = true;
    return; // This won't prevent the other event handlers from executing. :(
  }
};

object1.SomeEvent += checkSomething;
object1.SomeEvent += delegate {
  if(!e.Cancel) {
    // do something for object1 (if nothing happened)
  }
};

object2.SomeEvent += checkSomething;
object2.SomeEvent += delegate {
  if(!e.Cancel) {
    // do something else for object2 (if nothing happened)
  }
}

答案 2 :(得分:-1)

如果我理解你想做什么,最好的做法就是:

 EventHandler checkSomething = delegate(object sender, EventArgs e) {


           if (somethingHappened) {
                //STOP
                return;
            }//end if

            UIButton theButton = (UIButton)sender;
            if (theButton.Title == "Button1") {
            //do something for Object1
            }//end if

            if (theButton.Title == "Button2") {
            //do something for Object 2
            }
};