2009-04-17 51 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超出范围,但它不会被销毁,因为所定义的事件处理程序都具有对它的引用。所以它和它的价值将一直保持到不再需要。 我知道这不是对闭包最具技术性的解释,但应该让你知道它们是什么。

相关问题