0

我有一个带有 onclick 事件的按钮

<asp:Button ID="btn_Save" runat="server" Text="Save" OnClick="btn_Save_Click"/>

我有这个按钮的第二个 onclick 事件,如下所示。

((Button)btn).Click += new EventHandler(SaveClicked);

我调试并看到第一个发生在第二个之前,

我想从第一个取消第二个 onclick。

为什么我需要 2 个点击事件: 我有一个 web 控件(BulkEditGridView),它以一个 Button 控件作为参数,并且该控件保存整行。第二次点击事件充当保存整个表格。现在我向我的 web 控件添加了一些字段,并且我想在单击按钮时阻止保存。由于无法修改 webcontrols 事件处理程序(第二次点击事件),我添加了第一个 onclick 事件。我要做的是,如果其中一个字段(例如:文本框字段)为空,则阻止保存 gridview,这可以通过阻止默认单击事件来完成。

4

3 回答 3

2

只需从按钮单击事件中删除第二个事件处理程序。

((Button)btn).Click -= new EventHandler(SaveClicked);

但是当您不需要第二个事件处理程序时,为什么要添加它?

您也可以通过反射删除事件处理程序,您可以尝试此代码,但未经测试。

BindingFlags AllBindings = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;

List<FieldInfo> lst = new List<FieldInfo>();

foreach (EventInfo ei in btn.GetType().GetEvents(AllBindings))
{
    Type dt = ei.DeclaringType;
    FieldInfo fi = dt.GetField(ei.Name, AllBindings);
    if (fi != null)
        lst.Add(fi);
}

foreach (FieldInfo fi in lst)
{
    EventInfo ei = btn.GetType().GetEvent(fi.Name, AllBindings);
    if (ei != null)
    {
        object val = fi.GetValue(btn);
        Delegate mdel = (val as Delegate);
        if (mdel != null)
        {
            foreach (Delegate del in mdel.GetInvocationList())
                ei.RemoveEventHandler(btn, del);
        }
    }
}

它将删除所有事件处理程序。有关更多信息,您可以查看此链接 http://www.codeproject.com/Articles/103542/Removing-Event-Handlers-using-Reflection

于 2012-08-28T11:41:01.177 回答
0

我不知道我是否正确理解了您的查询。

使用 -= 删除第一种方法,然后添加第二种方法,然后再次添加第一种方法。

因此,您将首先执行第二种方法。

再次,不确定

于 2012-08-28T11:40:14.403 回答
0

可以使用会话变量。

于 2012-09-13T12:41:42.943 回答