如何将自定义事件args传递给标准的asp:controls

时间:2009-04-17 16:18:01

标签: asp.net

我可以很容易地理解如何在纯C#代码中使用自定义事件,但是如何在asp:button按钮上传递自定义事件参数?

我尝试过各种各样的事情(定义新事件args,新代表等等),但我没有运气。

是否有关于如何使用标准asp控件执行此操作的教程?

3 个答案:

答案 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事件时超出范围,它也不会被销毁,因为两个已定义的事件处理程序都引用了它。所以它和它的价值将一直保持到不再需要它为止。 我知道这不是封闭技术的最技术性解释,但应该让你知道它们是什么。