Как вернуть значение для события (всплывающее значение вверх)? - PullRequest
0 голосов
/ 06 октября 2010

Я пытаюсь изменить значение в аргументах события.Не уверен, что это возможно, но это мое текущее событие в родительском классе:

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 Ответ

1 голос
/ 06 октября 2010

Вам нужно будет удерживать ссылку на экземпляр 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.

...