2010-10-06 44 views
0

我正在嘗試更改事件參數中的值。不知道這是可能的,但是這是在父類中我目前的事件:如何返回一個事件的值(氣泡值增加)?

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

你需要堅持向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... 
} 

有一點要注意的這裏是有有可能導致意想不到的結果場景:

  • 監聽器可以選擇生成一個線程和處理呼叫異步
  • 有可能是對數聽衆同一個事件,每個事件都可以分配一個不同的值。您的代碼當然只會看到最後一個分配的代碼,但您將無法控制偵聽器的調用順序。

就拿下面的情況(上述第1點):

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實例。