我可以輕鬆理解如何在純C#代碼中使用自定義事件,但是如何在asp:按鈕單擊時傳遞自定義事件參數?如何將自定義事件參數傳遞給標準的asp:控件
我試過各種各樣的事情(定義新的事件參數,新的代表等等),但我沒有運氣。
有沒有關於如何使用標準的ASP控件做到這一點的教程?
我可以輕鬆理解如何在純C#代碼中使用自定義事件,但是如何在asp:按鈕單擊時傳遞自定義事件參數?如何將自定義事件參數傳遞給標準的asp:控件
我試過各種各樣的事情(定義新的事件參數,新的代表等等),但我沒有運氣。
有沒有關於如何使用標準的ASP控件做到這一點的教程?
只要您的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
委託,這將允許您在不投射的情況下執行上述操作。
我不相信有一種方法可以做到這一點,而無需創建自己的控件。但是,我有時使用按鈕上的commandagument和commandname屬性來提供更多信息
我不認爲你可以。 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
超出範圍,但它不會被銷燬,因爲所定義的事件處理程序都具有對它的引用。所以它和它的價值將一直保持到不再需要。
我知道這不是對閉包最具技術性的解釋,但應該讓你知道它們是什麼。
我確實遇到了一些關於eventargs和我的customeventargs之間兼容性的問題。我猜投射可以解決這個問題。我會試試:) – dotnetdev 2009-04-17 16:26:59