2011-03-22 60 views
2

我還在嘗試學習c#,我的問題是我如何將一個變量從Item1_Click傳遞給Item2_Click,這與在方法之間傳遞它們是一回事還是因爲它們是事件處理程序而不同?C#在方法和事件處理程序之間傳遞變量

public partial class Events : System.Web.UI.UserControl 
{ 
    protected void Item1_Click(object sender, EventArgs e) 
    { 

      //code 

    } 

    protected void Item2_Click(object sender, EventArgs e) 
    { 
      //code 
    } 
} 
+0

我認爲公平的說你不會在兩個方法(事件處理程序或不)之間傳遞變量。您將變量傳遞給方法,並通過變量返回結果。你可以設想在兩個點擊處理程序之間傳遞什麼,當它們可以以任何順序以及它們之間的任何時間長度被調用時? – Lazarus 2011-03-22 12:54:04

回答

2

他們仍然是常規的方法,所以你仍然可以打電話給他們以同樣的方式,你通常會。

protected void Item1_Click(object sender, EventArgs e) 
{ 
    // Call the event handler for Item2, passing the arguments 
    // Item1 received 
    Item2_Click(sender, e); 
} 

protected void Item2_Click(object sender, EventArgs e) 
{ 
    // Make it happen. 
} 

如果你想重新使用Item1_Click只是click事件的其他對象綁定到Item1_Click爲好。

見下面關於在C#中的事件的一些詳細信息的鏈接。

0

上面顯示的是一種方法。這僅僅是我想象你已經訂閱了你的方法來處理幾個按鈕上的事件。

然後由該按鈕來填充EventArgs的實例本身。如果您希望更改EventArgs的內容,那麼您需要繼承Button並覆蓋方法手動觸發事件。

你可以有你的表格上一些狀態信息(如果你想在兩種方法之間共享的信息)。或者,如果你硬是想從Item1_Click信息傳遞到Item2_click那麼你可以撥打:

protected void Item1_Click(object sender, EventArgs e) 
{ 
    this.Item2_Click(sender new EventArgs()); // <== Stick information in EventArgs 
} 
1

的事件處理程序通過事件的發佈者調用。所以如果這兩個處理程序都是相同類型的,你需要將這個值緩存在一個成員變量中。 Item1單擊緩存某些內容(例如,在變量中進行選擇),Item2單擊使用此成員變量進行自己的處理。

但是沒有什麼可以阻止你調用事件處理程序#2從事件處理程序#1;畢竟它是一種方法。在這種情況下,你可以在參數EventHandler參數中插入,但它有點不直觀。

0

如果您希望保留第一一些價值單擊,你可以設置一個變量,並從其他的處理程序讀取它。

public partial class Events : System.Web.UI.UserControl 
{ 
     private SomeType variable; 

     protected void Item1_Click(object sender, EventArgs e) 
    { 
      variable = someValue; 
      //code 
    } 

    protected void Item2_Click(object sender, EventArgs e) 
    { 
      //code + do stuff with variable 
    } 
} 
0

事件處理程序是方法本身,所以沒有區別在那裏。在方法之間發送數據(如果你願意的話)通過參數完成,但是,事件處理程序需要有特定的簽名,所以你不能只添加更多的參數。去這裏的方法是使用一個類的成員(字段或屬性)作爲某種「全局變量」(全局的類)作爲中提到@則必的回答

希望這有助於:)

0

相反直接調用您的事件處理程序,您可能需要創建包裝Item1_Click和Item2_Click功能的方法。例如..

public partial class Events : System.Web.UI.UserControl 
{ 
    protected void Item1_Click(object sender, EventArgs e) 
    { 

      var theParam = GetParamValue(); 
      //code 
      Item1Method(theParam); 

    } 

    protected void Item2_Click(object sender, EventArgs e) 
    {    
      Item2Method(); 
    } 

    private void Item1Method(object param1) 
    { 
     // Item 1 code goes here... 
    } 
    private void Item2Method() 
    { 
      //item 2 code goes here... 
      // then call Item1Method 
      var param2 = GetParamValue(); 
      Item1Method(param2); 
    } 
} 

這只是如何避免調用事件處理程序的例子。這樣做會使您的代碼更易於維護。

此外,現在你不必擔心試圖在Item1_Click

0

運行功能的事件處理程序時,提供一個發送者和事件參數的參數僅僅是一個方法,被稱爲在某些特定的場景。沒有什麼阻止你explicitlly調用這些方法的,所以

protected void Item1_Click(object sender, EventArgs e)  
{    
    Item2_Click(sender, e); //pass the original arguments 
    Item2_Click(null, null); //pass some other arguments 
    Item1_Click(null, null); //recursively call the handler. 
} 

是完全合法的C#代碼。然而,對於其他任何事情而言,使用事件處理程序是一個不好的做法,基本上處理事件。如果兩個處理程序需要使用相同的邏輯,最好這樣做:

protected void Item1_Click(object sender, EventArgs e) 
{ 
    CommonLogic(); 
} 

protected void Item2_Click(object sender, EventArgs e) 
{ 
    CommonLogic(); 
} 

private void CommonLogic() 
{ 
    //the common logic goes here 
}