如何为事件返回值(气泡值增加)?

时间:2010-10-06 07:09:52

标签: c# .net asp.net events event-handling

我正在尝试更改事件参数中的值。不确定这是否可行,但这是我在父类中的当前事件:

public void MasterClass()
{
   void btnSubmit_Click(object sender, EventArgs e)
   {
     ...
     OnInputBound(this, new InputEventArgs(postName, value));

     //I would like to try something like this but does not work:
     //value = OnInputBound(this, new InputEventArgs(postName, value));

     //Continue with new value...
   }
}

在应用程序的其他部分,他们通常会像这样注册事件:

protected override void CreateChildControls()
{
    MyForm.OnInputBound += new EventHandler<InputEventArgs>(MyForm_OnInputBound);
}

void MyForm_OnInputBound(object sender, SingleForm.InputEventArgs e)
{
    e.Value = "new value";
}

注意我是如何尝试更改MasterClass的参数。这显然不起作用,但我怎么会冒这个值呢?

1 个答案:

答案 0 :(得分:1)

您需要保留对InputEventArgs实例的引用,以便在事件发生后可以从中读取Value

void btnSubmit_Click(object sender, EventArgs e)
{
    ...
    InputEventArgs eventArgs = new InputEventArgs(postName, value);
    OnInputBound(this, eventArgs);

    value = eventArgs.Value;

    //Continue with new value...
}

有一点需要注意的是,有些情况可能导致意外结果:

  • 侦听器可以选择生成线程并异步处理调用
  • 同一事件可能有多个侦听器,每个侦听器可能分配不同的值。您的代码当然只会看到指定的最后一个代码,但您无法控制调用侦听器的顺序。

以下列情况为例(上面的第一点):

void MyForm_OnInputBound(object sender, SingleForm.InputEventArgs e)
{
    ThreadPool.QueueUserWorkItem(state => 
    {
        // perform some potentially lengthy database lookup or such
        // and then assign a new value
        e.Value = "new value";
    });

}

在这种情况下,无法保证在btnSubmit_Click中的代码从InputEventArgs实例中获取“新”值之前已分配该值。