我可以轻松理解如何在纯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