我可以很容易地理解如何在纯C#代码中使用自定义事件,但是如何在asp:button按钮上传递自定义事件参数?
我尝试过各种各样的事情(定义新事件args,新代表等等),但我没有运气。
是否有关于如何使用标准asp控件执行此操作的教程?
答案 0 :(得分:4)
只要您的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; }
}
我知道你正在与现有的控制代表合作,所以遗憾的是这种投射是必要的。请记住,虽然.NET 2.0及更高版本中有一个EventHandler<T> where T : EventArgs
委托,但您可以在不进行强制转换的情况下执行上述操作。
答案 1 :(得分:1)
如果不创建自己的控件,我不相信有办法做到这一点。但是,我有时会在按钮上使用commandagument和commandname属性来提供其他信息
答案 2 :(得分: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理解为什么这是输出是理解闭包的重要一步!即使
number
在处理Click事件时超出范围,它也不会被销毁,因为两个已定义的事件处理程序都引用了它。所以它和它的价值将一直保持到不再需要它为止。 我知道这不是封闭技术的最技术性解释,但应该让你知道它们是什么。