2009-04-17 33 views
0

我可以輕鬆理解如何在純C#代碼中使用自定義事件,但是如何在asp:按鈕單擊時傳遞自定義事件參數?如何將自定義事件參數傳遞給標準的asp:控件

我試過各種各樣的事情(定義新的事件參數,新的代表等等),但我沒有運氣。

有沒有關於如何使用標準的ASP控件做到這一點的教程?

回答

3

只要您的EventArgs從System.EventArgs繼承,您將能夠傳遞它們。然後,一旦進入事件處理程序,就可以將事件轉換爲適當的子類型。

下面是一個例子:

using System; 

class Program 
{ 
    static event EventHandler Foo; 

    static void Main() 
    { 
     // Here is cast the EventArgs to FooEventArgs 
     Foo += (o,e) => Console.WriteLine(((FooEventArgs)e).Number); 

     // Notice that I am passing a "FooEventArgs" instance 
     // even though the delegate signature for "EventHandler" 
     // specifies "EventArgs". Polymorphism in action. :) 
     Foo(null, new FooEventArgs { Number = 1 }); 
    } 
} 

class FooEventArgs : EventArgs 
{ 
    public int Number { get; set; } 
} 

我知道你是用現有的控制代表工作,所以很遺憾這種鑄造的是neccessary。請記住,在.NET 2.0及更高版本中有一個EventHandler<T> where T : EventArgs委託,這將允許您在不投射的情況下執行上述操作。

+0

我確實遇到了一些關於eventargs和我的customeventargs之間兼容性的問題。我猜投射可以解決這個問題。我會試試:) – dotnetdev 2009-04-17 16:26:59

1

我不相信有一種方法可以做到這一點,而無需創建自己的控件。但是,我有時使用按鈕上的commandagument和commandname屬性來提供更多信息

1

我不認爲你可以。 Button本身會用它自己的EventArgs對象調用Click事件,不幸的是你不能劫持那個調用。但是,您可以使用閉包:

protected void Page_Load(object sender, EventArgs e) 
{ 
    int number = 1; 
    button.Click += (o, args) => Response.Write("Expression:"+number++); 
    number = 10; 
    button.Click += delegate(object o, EventArgs args) { Response.Write("Anonymous:"+number); }; 
} 

順便說輸出,這是

Expression:10Anonymous:11
理解爲什麼是這樣的輸出是進了一大步瞭解倒閉!儘管在處理Click事件時 number超出範圍,但它不會被銷燬,因爲所定義的事件處理程序都具有對它的引用。所以它和它的價值將一直保持到不再需要。 我知道這不是對閉包最具技術性的解釋,但應該讓你知道它們是什麼。

相關問題